From 3fd9ae9664a57eac0fbf3b88b8f6971d293b13e5 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Tue, 5 Sep 2017 09:22:21 +0000 Subject: [PATCH] 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 --- gcc/ada/ChangeLog | 5 +++++ gcc/ada/gcc-interface/trans.c | 12 ++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) 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. */ -- 2.30.2