[Ada] Handling up-level references in protected entries and freeze nodes
authorGary Dismukes <dismukes@adacore.com>
Thu, 12 Dec 2019 10:02:38 +0000 (10:02 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Thu, 12 Dec 2019 10:02:38 +0000 (10:02 +0000)
2019-12-12  Gary Dismukes  <dismukes@adacore.com>

gcc/ada/

* exp_ch9.adb (Build_Protected_Entry): Analyze the block created
to hold the declarations and statements of the protected entry
body right after it's created, and then call Reset_Scopes_To on
that block to reset the Scope of nested entities to the block
scope.
(Reset_Scope): Add handling for N_Freeze_Entity nodes, calling
Reset_Scopes recursively on the Actions of such nodes. Also, for
subprogram bodies that are encountered that might not have a
separate declaration (such as type init procedures), reset the
Scope of the subprogram's entity.

From-SVN: r279289

gcc/ada/ChangeLog
gcc/ada/exp_ch9.adb

index 9e271acd00e00c70ebfd2909b5b5304c392bbf80..f28fa45be5c5e0562b546e2efb57010e0e94a131 100644 (file)
@@ -1,3 +1,16 @@
+2019-12-12  Gary Dismukes  <dismukes@adacore.com>
+
+       * exp_ch9.adb (Build_Protected_Entry): Analyze the block created
+       to hold the declarations and statements of the protected entry
+       body right after it's created, and then call Reset_Scopes_To on
+       that block to reset the Scope of nested entities to the block
+       scope.
+       (Reset_Scope): Add handling for N_Freeze_Entity nodes, calling
+       Reset_Scopes recursively on the Actions of such nodes. Also, for
+       subprogram bodies that are encountered that might not have a
+       separate declaration (such as type init procedures), reset the
+       Scope of the subprogram's entity.
+
 2019-12-12  Justin Squirek  <squirek@adacore.com>
 
        * sem_attr.adb (Analyze_Attribute): Add error message for
index 720c1a9a23727ae50a3364085a35ce22dec51da6..6e34de131ffb23e8a09bc8eec8ab905084ce0ce8 100644 (file)
@@ -48,6 +48,7 @@ with Rident;   use Rident;
 with Rtsfind;  use Rtsfind;
 with Sem;      use Sem;
 with Sem_Aux;  use Sem_Aux;
+with Sem_Ch5;  use Sem_Ch5;
 with Sem_Ch6;  use Sem_Ch6;
 with Sem_Ch8;  use Sem_Ch8;
 with Sem_Ch9;  use Sem_Ch9;
@@ -3722,6 +3723,14 @@ package body Exp_Ch9 is
             Declarations               => Decls,
             Handled_Statement_Sequence => Handled_Statement_Sequence (N)));
 
+      --  Analyze now and reset scopes for declarations so that Scope fields
+      --  currently denoting the entry will now denote the block scope.
+
+      Analyze_Statements (Bod_Stmts);
+
+      Reset_Scopes_To
+        (First (Bod_Stmts), Entity (Identifier (First (Bod_Stmts))));
+
       case Corresponding_Runtime_Package (Pid) is
          when System_Tasking_Protected_Objects_Entries =>
             Append_To (Bod_Stmts,
@@ -14977,7 +14986,27 @@ package body Exp_Ch9 is
                Next (Decl);
             end loop;
 
+         elsif Nkind (N) = N_Freeze_Entity then
+
+            --  Scan the actions associated with a freeze node, which may
+            --  actually be declarations with entities that need to have
+            --  their scopes reset.
+
+            Decl := First (Actions (N));
+            while Present (Decl) loop
+               Reset_Scopes (Decl);
+               Next (Decl);
+            end loop;
+
          elsif N /= Bod and then Nkind (N) in N_Proper_Body then
+
+            --  A subprogram without a separate declaration may be encountered,
+            --  and we need to reset the subprogram's entity's scope.
+
+            if Nkind (N) = N_Subprogram_Body then
+               Set_Scope (Defining_Entity (Specification (N)), E);
+            end if;
+
             return Skip;
          end if;