From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 7871) id 6665E3858000; Thu, 15 Jun 2023 08:03:31 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 6665E3858000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1686816211; bh=8kUAUwVG77Ex7HFpP3tI852/aEsftxwkrzHTMiOpLHE=; h=From:To:Subject:Date:From; b=a9Ek9jZqmRlH9e/hWJDAyZVNRROtuPgJ2JVXN4qAHXyNajsZOJO3TSArqAAEEUqKr zMKjZ9sRAAXHigWAlCmtXO/muu9jufaBH/Yk9o9l3pwoozOuI0gCddSygRak2fhuWw ohAJ+/m5ehDb3ck16bWbiu+8o9Qwz18HuhzCcXYs= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Marc Poulhi?s To: gcc-cvs@gcc.gnu.org Subject: [gcc r14-1863] ada: Fix wrong finalization for double subtype of bounded vector X-Act-Checkin: gcc X-Git-Author: Eric Botcazou X-Git-Refname: refs/heads/master X-Git-Oldrev: cc681c83f04fedfad02744c7194a042715a2ec80 X-Git-Newrev: 59a8207f83855d756a6a87fa4b9537899d88f0a2 Message-Id: <20230615080331.6665E3858000@sourceware.org> Date: Thu, 15 Jun 2023 08:03:31 +0000 (GMT) List-Id: https://gcc.gnu.org/g:59a8207f83855d756a6a87fa4b9537899d88f0a2 commit r14-1863-g59a8207f83855d756a6a87fa4b9537899d88f0a2 Author: Eric Botcazou Date: Wed May 10 18:00:36 2023 +0200 ada: Fix wrong finalization for double subtype of bounded vector The special handling of temporaries created for return values and subject to a renaming needs to be restricted to the top level, where it is needed to prevent dangling references to the frame of the elaboration routine from being created, because, at a lower level, the front-end may create implicit renamings of objects as these temporaries, so a copy is not allowed. gcc/ada/ * gcc-interface/decl.cc (gnat_to_gnu_entity) : Restrict the special handling of temporaries created for return values and subject to a renaming to the top level. Diff: --- gcc/ada/gcc-interface/decl.cc | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/gcc/ada/gcc-interface/decl.cc b/gcc/ada/gcc-interface/decl.cc index e5e04ddad93..b2b77787bc0 100644 --- a/gcc/ada/gcc-interface/decl.cc +++ b/gcc/ada/gcc-interface/decl.cc @@ -1076,9 +1076,13 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition) || EXPRESSION_CLASS_P (inner) /* We need to detect the case where a temporary is created to hold the return value, since we cannot safely rename it at - top level as it lives only in the elaboration routine. */ + top level because it lives only in the elaboration routine. + But, at a lower level, an object initialized by a function + call may be (implicitly) renamed as this temporary by the + front-end and, in this case, we cannot make a copy. */ || (VAR_P (inner) - && DECL_RETURN_VALUE_P (inner)) + && DECL_RETURN_VALUE_P (inner) + && global_bindings_p ()) /* We also need to detect the case where the front-end creates a dangling 'reference to a function call at top level and substitutes it in the renaming, for example: @@ -1092,12 +1096,14 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition) q__b : boolean renames q__R1s.all.e (1); We cannot safely rename the rewritten expression since the - underlying object lives only in the elaboration routine. */ + underlying object lives only in the elaboration routine but, + as above, this cannot be done at a lower level. */ || (INDIRECT_REF_P (inner) && (inner = remove_conversions (TREE_OPERAND (inner, 0), true)) && VAR_P (inner) - && DECL_RETURN_VALUE_P (inner))) + && DECL_RETURN_VALUE_P (inner) + && global_bindings_p ())) ; /* Otherwise, this is an lvalue being renamed, so it needs to be