From: Eric Botcazou <[email protected]>
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.
Tested on x86_64-pc-linux-gnu, committed on master.
---
gcc/ada/exp_ch3.adb | 17 ++++++++++++++---
1 file changed, 14 insertions(+), 3 deletions(-)
diff --git a/gcc/ada/exp_ch3.adb b/gcc/ada/exp_ch3.adb
index fbedc16ddd0..778eed7f16e 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.
--
2.40.0