diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2023-09-27 20:42:41 +0200 |
---|---|---|
committer | Marc Poulhiès <poulhies@adacore.com> | 2023-10-10 14:12:28 +0200 |
commit | e05e5d6bc60f938717a58a3a715c67236b0b2974 (patch) | |
tree | 57fed7fcfc2fb4c0468db8e04076bd46d8f8ad71 | |
parent | 6bd83c90191a512d2c9094623248219d610b4372 (diff) | |
download | gcc-e05e5d6bc60f938717a58a3a715c67236b0b2974.zip gcc-e05e5d6bc60f938717a58a3a715c67236b0b2974.tar.gz gcc-e05e5d6bc60f938717a58a3a715c67236b0b2974.tar.bz2 |
ada: Fix bad finalization of limited aggregate in conditional expression
This happens when the conditional expression is immediately returned, for
example in an expression function.
gcc/ada/
* exp_aggr.adb (Is_Build_In_Place_Aggregate_Return): Return true
if the aggregate is a dependent expression of a conditional
expression being returned from a build-in-place function.
-rw-r--r-- | gcc/ada/exp_aggr.adb | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/gcc/ada/exp_aggr.adb b/gcc/ada/exp_aggr.adb index 165f517..e5f3632 100644 --- a/gcc/ada/exp_aggr.adb +++ b/gcc/ada/exp_aggr.adb @@ -173,8 +173,11 @@ package body Exp_Aggr is ------------------------------------------------------ function Is_Build_In_Place_Aggregate_Return (N : Node_Id) return Boolean; - -- True if N is an aggregate (possibly qualified or converted) that is - -- being returned from a build-in-place function. + -- True if N is an aggregate (possibly qualified or a dependent expression + -- of a conditional expression, and possibly recursively so) that is being + -- returned from a build-in-place function. Such qualified and conditional + -- expressions are transparent for this purpose because an enclosing return + -- is propagated resp. distributed into these expressions by the expander. function Build_Record_Aggr_Code (N : Node_Id; @@ -8463,7 +8466,11 @@ package body Exp_Aggr is P : Node_Id := Parent (N); begin - while Nkind (P) = N_Qualified_Expression loop + while Nkind (P) in N_Case_Expression + | N_Case_Expression_Alternative + | N_If_Expression + | N_Qualified_Expression + loop P := Parent (P); end loop; |