From: Eric Botcazou Date: Tue, 5 Sep 2017 09:22:21 +0000 (+0000) Subject: trans.c (Attribute_to_gnu): Do not strip conversions around prefixes that are not... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3fd9ae9664a57eac0fbf3b88b8f6971d293b13e5;p=gcc.git trans.c (Attribute_to_gnu): Do not strip conversions around prefixes that are not references. * gcc-interface/trans.c (Attribute_to_gnu) : Do not strip conversions around prefixes that are not references. From-SVN: r251704 --- diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 0dbc77918de..cce0e41dff0 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2017-09-05 Eric Botcazou + + * gcc-interface/trans.c (Attribute_to_gnu) : Do not strip + conversions around prefixes that are not references. + 2017-09-05 Eric Botcazou * gcc-interface/utils.c (unchecked_convert): When the result type is a diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index 270bf7a49dc..518016dc390 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -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. */