From 7a4fb11f08717c61b4a1faf89ed53552872eb6e7 Mon Sep 17 00:00:00 2001 From: ebotcazou Date: Tue, 5 Sep 2017 09:22:21 +0000 Subject: [PATCH] * gcc-interface/trans.c (Attribute_to_gnu) : Do not strip conversions around prefixes that are not references. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@251704 138bc75d-0d04-0410-961f-82ee72b054a4 --- 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,5 +1,10 @@ 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 non-biased integral type with size 0, set the result to 0 directly. 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.11.4.GIT