]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
ada: Compile time crash on limited object in extended return
authorsquirek <squirek@adacore.com>
Wed, 30 Oct 2024 16:33:29 +0000 (16:33 +0000)
committerMarc Poulhiès <dkm@gcc.gnu.org>
Tue, 12 Nov 2024 13:05:48 +0000 (14:05 +0100)
This patch fixes an error in the compiler whereby using an extended return on
an object of limited tagged type which extends a tagged protected type may lead
to a compile-time crash.

gcc/ada/ChangeLog:

* exp_ch3.adb (Build_Assignment): Add condition to fetch corresponding
record types for concurrent tagged types.

gcc/ada/exp_ch3.adb

index 3dd4d9cd07e15382ed8facd889e87aece8ea1b6d..9d61d4174e98b3f80927beb38a2b13e91e067f24 100644 (file)
@@ -2692,11 +2692,23 @@ package body Exp_Ch3 is
            and then Tagged_Type_Expansion
            and then Nkind (Exp_Q) /= N_Raise_Expression
          then
-            Append_To (Res,
-              Make_Tag_Assignment_From_Type
-                (Default_Loc,
-                 New_Copy_Tree (Lhs, New_Scope => Proc_Id),
-                 Underlying_Type (Typ)));
+            --  Get the relevant type for the call to
+            --  Make_Tag_Assignment_From_Type, which, for concurrent types is
+            --  their corresponding record.
+
+            declare
+               T : Entity_Id := Underlying_Type (Typ);
+            begin
+               if Ekind (T) in E_Protected_Type | E_Task_Type then
+                  T := Corresponding_Record_Type (T);
+               end if;
+
+               Append_To (Res,
+                 Make_Tag_Assignment_From_Type
+                   (Default_Loc,
+                    New_Copy_Tree (Lhs, New_Scope => Proc_Id),
+                    T));
+            end;
          end if;
 
          --  Adjust the component if controlled except if it is an aggregate