aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2023-05-13 10:55:44 +0200
committerMarc Poulhiès <poulhies@adacore.com>2023-06-15 09:59:37 +0200
commitc8c5bf93aaa481d4b08491d4545b74e2b329d16d (patch)
treec537e34a093e930a0e101a0a31cda9ecd17a1e0a /gcc
parent3f3f37c3f72f4840ef2d304e00f5bc8c28374bce (diff)
downloadgcc-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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/exp_ch3.adb17
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.