diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2023-05-13 10:55:44 +0200 |
---|---|---|
committer | Marc Poulhiès <poulhies@adacore.com> | 2023-06-15 09:59:37 +0200 |
commit | c8c5bf93aaa481d4b08491d4545b74e2b329d16d (patch) | |
tree | c537e34a093e930a0e101a0a31cda9ecd17a1e0a | |
parent | 3f3f37c3f72f4840ef2d304e00f5bc8c28374bce (diff) | |
download | gcc-c8c5bf93aaa481d4b08491d4545b74e2b329d16d.zip gcc-c8c5bf93aaa481d4b08491d4545b74e2b329d16d.tar.gz gcc-c8c5bf93aaa481d4b08491d4545b74e2b329d16d.tar.bz2 |
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.
-rw-r--r-- | gcc/ada/exp_ch3.adb | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/gcc/ada/exp_ch3.adb b/gcc/ada/exp_ch3.adb index fbedc16..778eed7 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. |