trans.c (Attribute_to_gnu): Do not strip conversions around prefixes that are not...
authorEric Botcazou <ebotcazou@adacore.com>
Tue, 5 Sep 2017 09:22:21 +0000 (09:22 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 5 Sep 2017 09:22:21 +0000 (09:22 +0000)
* gcc-interface/trans.c (Attribute_to_gnu) <Attr_Address>: Do not strip
conversions around prefixes that are not references.

From-SVN: r251704

gcc/ada/ChangeLog
gcc/ada/gcc-interface/trans.c

index 0dbc779..cce0e41 100644 (file)
@@ -1,5 +1,10 @@
 2017-09-05  Eric Botcazou  <ebotcazou@adacore.com>
 
+       * gcc-interface/trans.c (Attribute_to_gnu) <Attr_Address>: Do not strip
+       conversions around prefixes that are not references.
+
+2017-09-05  Eric Botcazou  <ebotcazou@adacore.com>
+
        * gcc-interface/utils.c (unchecked_convert): When the result type is a
        non-biased integral type with size 0, set the result to 0 directly.
 
index 270bf7a..518016d 100644 (file)
@@ -1629,10 +1629,14 @@ Attribute_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, int attribute)
 
     case Attr_Address:
     case Attr_Unrestricted_Access:
-      /* Conversions don't change addresses but can cause us to miss the
-        COMPONENT_REF case below, so strip them off.  */
-      gnu_prefix = remove_conversions (gnu_prefix,
-                                      !Must_Be_Byte_Aligned (gnat_node));
+      /* Conversions don't change the address of references but can cause
+        build_unary_op to miss the references below, so strip them off.
+        On the contrary, if the address-of operation causes a temporary
+        to be created, then it must be created with the proper type.  */
+      gnu_expr = remove_conversions (gnu_prefix,
+                                    !Must_Be_Byte_Aligned (gnat_node));
+      if (REFERENCE_CLASS_P (gnu_expr))
+       gnu_prefix = gnu_expr;
 
       /* If we are taking 'Address of an unconstrained object, this is the
         pointer to the underlying array.  */