]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
ada: Fix missing finalization for aggregates nested in conditional expressions
authorEric Botcazou <ebotcazou@adacore.com>
Sun, 14 May 2023 09:49:09 +0000 (11:49 +0200)
committerMarc Poulhiès <poulhies@adacore.com>
Thu, 15 Jun 2023 07:59:36 +0000 (09:59 +0200)
The finalization actions for the components of the aggregates are blocked
by Expand_Ctrl_Function_Call, which sets Is_Ignored_Transient on all the
temporaries generated from within a conditional expression whatever the
intermediate constructs.  Now aggregates and their expansion in the form
of block and loop statements are "impenetrable" as far as temporaries are
concerned, i.e. the lifetime of temporaries generated within them does
not extend beyond them, so their finalization must not be blocked there.

gcc/ada/

* exp_util.ads (Within_Case_Or_If_Expression): Adjust description.
* exp_util.adb (Find_Hook_Context): Stop the search for the topmost
conditional expression, if within one, at contexts where temporaries
may be contained.
(Within_Case_Or_If_Expression): Return false upon first encoutering
contexts where temporaries may be contained.

gcc/ada/exp_util.adb
gcc/ada/exp_util.ads

index b032336523d252d255f044124a3e45420b657196..a4aa5f64447ea2cf619c3ceea2fd951cdb5f1e36 100644 (file)
@@ -6500,6 +6500,16 @@ package body Exp_Util is
             then
                Top := Par;
 
+            --  Stop at contexts where temporaries may be contained
+
+            elsif Nkind (Par) in N_Aggregate
+                               | N_Delta_Aggregate
+                               | N_Extension_Aggregate
+                               | N_Block_Statement
+                               | N_Loop_Statement
+            then
+               exit;
+
             --  Prevent the search from going too far
 
             elsif Is_Body_Or_Package_Declaration (Par) then
@@ -14222,6 +14232,16 @@ package body Exp_Util is
          then
             return True;
 
+         --  Stop at contexts where temporaries may be contained
+
+         elsif Nkind (Par) in N_Aggregate
+                            | N_Delta_Aggregate
+                            | N_Extension_Aggregate
+                            | N_Block_Statement
+                            | N_Loop_Statement
+         then
+            return False;
+
          --  Prevent the search from going too far
 
          elsif Is_Body_Or_Package_Declaration (Par) then
index 66c4dc6be4cbe4e5770d8e788969776e7dc99a7e..24065b6f7b6eca0a177ff28c4e346677bd8cb8de 100644 (file)
@@ -1240,7 +1240,9 @@ package Exp_Util is
    --  extension to verify legality rules on inherited conditions.
 
    function Within_Case_Or_If_Expression (N : Node_Id) return Boolean;
-   --  Determine whether arbitrary node N is within a case or an if expression
+   --  Determine whether arbitrary node N is immediately within a case or an if
+   --  expression. The criterion is whether temporaries created by the actions
+   --  attached to N need to outlive an enclosing case or if expression.
 
 private
    pragma Inline (Duplicate_Subexpr);