diff mbox series

[Ada] Fix bogus constraint error on value conversion with -gnatVa

Message ID 3137505.kkK2uPGjte@polaris
State New
Headers show
Series [Ada] Fix bogus constraint error on value conversion with -gnatVa | expand

Commit Message

Eric Botcazou Sept. 5, 2017, 9:22 a.m. UTC
Tested on x86_64-suse-linux, applied on mainline.


2017-09-05  Eric Botcazou  <ebotcazou@adacore.com>

	* gcc-interface/trans.c (Attribute_to_gnu) <Attr_Address>: Do notstrip
	conversions around prefixes that are not references.
diff mbox series

Patch

Index: gcc-interface/trans.c
===================================================================
--- gcc-interface/trans.c	(revision 251700)
+++ gcc-interface/trans.c	(working copy)
@@ -1629,10 +1629,14 @@  Attribute_to_gnu (Node_Id gnat_node, tre
 
     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.  */