From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1914) id F2CD73884571; Wed, 11 May 2022 08:55:23 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org F2CD73884571 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Pierre-Marie de Rodat To: gcc-cvs@gcc.gnu.org Subject: [gcc r13-299] [Ada] Excess finalization on assignment with target name symbol X-Act-Checkin: gcc X-Git-Author: Gary Dismukes X-Git-Refname: refs/heads/master X-Git-Oldrev: 6281d36342c29cdd9acb32032f59bf440953c942 X-Git-Newrev: 42c0119157824beb106345faa4b100c10dbb38cc Message-Id: <20220511085523.F2CD73884571@sourceware.org> Date: Wed, 11 May 2022 08:55:23 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 11 May 2022 08:55:24 -0000 https://gcc.gnu.org/g:42c0119157824beb106345faa4b100c10dbb38cc commit r13-299-g42c0119157824beb106345faa4b100c10dbb38cc Author: Gary Dismukes Date: Thu Jan 27 20:17:03 2022 -0500 [Ada] Excess finalization on assignment with target name symbol In cases where the Ada 2022 feature of target name symbols (@) is used and the evaluation of the name is side-effect free, the compiler creates a temporary object to hold the value of the target object for use as the value of "@" symbols in the right-hand side expression. In the case where the target's type is controlled, or has controlled subcomponents, this can result in extra finalization calls (for the temporary object). The correction is to bypass the use of a temp and fall back on the more general approach of creating and calling a procedure with an in-out parameter for performing the assignment. gcc/ada/ * exp_ch5.adb (Expand_Assign_With_Target_Names): Bypass the temp object approach in the case where the type of the LHS is controlled or has controlled subcomponents (Needs_Finalization is True), and use the procedure approach instead. Diff: --- gcc/ada/exp_ch5.adb | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/gcc/ada/exp_ch5.adb b/gcc/ada/exp_ch5.adb index ba575740a3d..2e401ca13ef 100644 --- a/gcc/ada/exp_ch5.adb +++ b/gcc/ada/exp_ch5.adb @@ -2246,9 +2246,15 @@ package body Exp_Ch5 is Expression => New_RHS)); -- The left-hand side is not a direct name, but is side-effect free. - -- Capture its value in a temporary to avoid multiple evaluations. - - elsif Side_Effect_Free (LHS) then + -- Capture its value in a temporary to avoid generating a procedure. + -- We don't do this optimization if the target object's type may need + -- finalization actions, because we don't want extra finalizations to + -- be done for the temp object, and instead we use the more general + -- procedure-based approach below. + + elsif Side_Effect_Free (LHS) + and then not Needs_Finalization (Etype (LHS)) + then Ent := Make_Temporary (Loc, 'T'); Replace_Target_Name (New_RHS);