aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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.