From: Eric Botcazou <ebotca...@adacore.com> When the type of the return object is a constrained array, there may be an implicit sliding that needs to be preserved during the expansion.
gcc/ada/ * exp_ch3.adb (Make_Allocator_For_Return): Convert the expression to the return object's type in the constrained array case as well. Tested on x86_64-pc-linux-gnu, committed on master. --- gcc/ada/exp_ch3.adb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/gcc/ada/exp_ch3.adb b/gcc/ada/exp_ch3.adb index 6886bde7bd1..daa96df4b32 100644 --- a/gcc/ada/exp_ch3.adb +++ b/gcc/ada/exp_ch3.adb @@ -7181,11 +7181,13 @@ package body Exp_Ch3 is Alloc_Expr := New_Copy_Tree (Expr); + -- In the constrained array case, deal with a potential sliding. -- In the interface case, put back a conversion that we may have - -- remove earlier in the processing. + -- removed earlier in the processing. - if Is_Interface (Typ) - and then Is_Class_Wide_Type (Etype (Alloc_Expr)) + if (Ekind (Typ) = E_Array_Subtype + or else (Is_Interface (Typ) + and then Is_Class_Wide_Type (Etype (Alloc_Expr)))) and then Typ /= Etype (Alloc_Expr) then Alloc_Expr := Convert_To (Typ, Alloc_Expr); -- 2.34.1