From: Eric Botcazou <ebotca...@adacore.com> 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. Tested on x86_64-pc-linux-gnu, committed on master. --- gcc/ada/exp_aggr.adb | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/gcc/ada/exp_aggr.adb b/gcc/ada/exp_aggr.adb index 165f517c031..e5f36326600 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; -- 2.42.0