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

commit r16-1445-ga09a8093da4329b42309c56e86da49d18e6c8fde
Author: Ronan Desplanques <desplanq...@adacore.com>
Date:   Wed Apr 2 10:48:57 2025 +0200

    ada: Tweak special handling of synchronized type scopes
    
    Exp_Util.Insert_Actions handles scopes of synchronized types specially,
    but the condition it tested before this patch was not quite correct in
    some cases, for example during some expansion operations made under
    Expand_N_Task_Type_Declaration. This patch refines the test.
    
    gcc/ada/ChangeLog:
    
            * exp_util.adb (Insert_Actions): Refine test.

Diff:
---
 gcc/ada/exp_util.adb | 28 ++++++++++++++++++++--------
 1 file changed, 20 insertions(+), 8 deletions(-)

diff --git a/gcc/ada/exp_util.adb b/gcc/ada/exp_util.adb
index 8ac1b9001a45..45eb808a8d21 100644
--- a/gcc/ada/exp_util.adb
+++ b/gcc/ada/exp_util.adb
@@ -8228,19 +8228,31 @@ package body Exp_Util is
                   return;
                end if;
 
-            --  the expansion of Task and protected type declarations can
+            --  The expansion of task and protected type declarations can
             --  create declarations for temporaries which, like other actions
-            --  are inserted and analyzed before the current declaraation.
-            --  However, the current scope is the synchronized type, and
-            --  for unnesting it is critical that the proper scope for these
-            --  generated entities be the enclosing one.
+            --  are inserted and analyzed before the current declaration.
+            --  However, in some cases, the current scope is the synchronized
+            --  type, and for unnesting it is critical that the proper scope
+            --  for these generated entities be the enclosing one.
 
             when N_Task_Type_Declaration
                | N_Protected_Type_Declaration =>
 
-               Push_Scope (Scope (Current_Scope));
-               Insert_List_Before_And_Analyze (P, Ins_Actions);
-               Pop_Scope;
+               declare
+                  Skip_Scope : constant Boolean :=
+                    Ekind (Current_Scope) in Concurrent_Kind;
+               begin
+                  if Skip_Scope then
+                     Push_Scope (Scope (Current_Scope));
+                  end if;
+
+                  Insert_List_Before_And_Analyze (P, Ins_Actions);
+
+                  if Skip_Scope then
+                     Pop_Scope;
+                  end if;
+               end;
+
                return;
 
             --  A special case, N_Raise_xxx_Error can act either as a statement

Reply via email to