]> gcc.gnu.org Git - gcc.git/commitdiff
ada: Fix latent bug exposed by recent work on extended return statements
authorEric Botcazou <ebotcazou@adacore.com>
Thu, 12 Jan 2023 23:55:51 +0000 (00:55 +0100)
committerMarc Poulhiès <poulhies@adacore.com>
Mon, 16 Jan 2023 14:44:55 +0000 (15:44 +0100)
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.

gcc/ada/exp_ch3.adb

index 6886bde7bd1ca9dd289a82739c118ae013016c50..daa96df4b32c7b6862ab0881bb407f5e1da40aab 100644 (file)
@@ -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);
This page took 0.08478 seconds and 5 git commands to generate.