https://gcc.gnu.org/g:c77a2cf0ec892256ef47edf373607d3b0a807210

commit r15-5161-gc77a2cf0ec892256ef47edf373607d3b0a807210
Author: squirek <squi...@adacore.com>
Date:   Wed Oct 30 16:33:29 2024 +0000

    ada: Compile time crash on limited object in extended return
    
    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.

Diff:
---
 gcc/ada/exp_ch3.adb | 22 +++++++++++++++++-----
 1 file changed, 17 insertions(+), 5 deletions(-)

diff --git a/gcc/ada/exp_ch3.adb b/gcc/ada/exp_ch3.adb
index 3dd4d9cd07e1..9d61d4174e98 100644
--- a/gcc/ada/exp_ch3.adb
+++ b/gcc/ada/exp_ch3.adb
@@ -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

Reply via email to