From: Eric Botcazou Date: Sat, 13 May 2023 08:55:44 +0000 (+0200) Subject: ada: Fix too small secondary stack allocation for returned aggregate X-Git-Tag: basepoints/gcc-15~8282 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c8c5bf93aaa481d4b08491d4545b74e2b329d16d;p=thirdparty%2Fgcc.git ada: Fix too small secondary stack allocation for returned aggregate This restores the specific treatment of aggregates that are returned through an extended return statement in a function returning a class-wide type, and which was incorrectly dropped in an earlier change. gcc/ada/ * exp_ch3.adb (Make_Allocator_For_Return): Deal again specifically with an aggregate returned through an object of a class-wide type. --- diff --git a/gcc/ada/exp_ch3.adb b/gcc/ada/exp_ch3.adb index fbedc16ddd0c..778eed7f16e8 100644 --- a/gcc/ada/exp_ch3.adb +++ b/gcc/ada/exp_ch3.adb @@ -7167,9 +7167,20 @@ package body Exp_Ch3 is Expression => Alloc_Expr)); else - Alloc := - Make_Allocator (Loc, - Expression => New_Occurrence_Of (Typ, Loc)); + -- If the return object is of a class-wide type, we cannot use + -- its type for the allocator. Instead we use the type of the + -- expression, which must be an aggregate of a definite type. + + if Is_Class_Wide_Type (Typ) then + Alloc := + Make_Allocator (Loc, + Expression => New_Occurrence_Of (Etype (Expr), Loc)); + + else + Alloc := + Make_Allocator (Loc, + Expression => New_Occurrence_Of (Typ, Loc)); + end if; -- If the return object requires default initialization, then it -- will happen later following the elaboration of the renaming.