public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
From: Pierre-Marie de Rodat <pmderodat@gcc.gnu.org>
To: gcc-cvs@gcc.gnu.org
Subject: [gcc r13-299] [Ada] Excess finalization on assignment with target name symbol
Date: Wed, 11 May 2022 08:55:23 +0000 (GMT)	[thread overview]
Message-ID: <20220511085523.F2CD73884571@sourceware.org> (raw)

https://gcc.gnu.org/g:42c0119157824beb106345faa4b100c10dbb38cc

commit r13-299-g42c0119157824beb106345faa4b100c10dbb38cc
Author: Gary Dismukes <dismukes@adacore.com>
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);


                 reply	other threads:[~2022-05-11  8:55 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220511085523.F2CD73884571@sourceware.org \
    --to=pmderodat@gcc.gnu.org \
    --cc=gcc-cvs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).