[Ada] Unnesting issues with entry families and accept statements
authorGary Dismukes <dismukes@adacore.com>
Thu, 10 Oct 2019 15:25:08 +0000 (15:25 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Thu, 10 Oct 2019 15:25:08 +0000 (15:25 +0000)
2019-10-10  Gary Dismukes  <dismukes@adacore.com>

gcc/ada/

* sem_util.adb (Enclosing_Subprogram): Handle the case of
E_Entry_Family, returning the entry family's associated
Protected_Body_Subprogram (as was already done for E_Entry).
* exp_ch9.adb (Expand_N_Accept_Statement): Call Reset_Scopes_To
on the block created for an accept statement to reset the scopes
of any local entities to the block scope.

From-SVN: r276830

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

index c5e3f820d96d1c4ecf622e51d7c75d74a0d40654..9cf5172802287fcf7bdfbea4a3921251466558ea 100644 (file)
@@ -1,6 +1,8 @@
-2019-10-10  Ed Schonberg  <schonberg@adacore.com>
+2019-10-10  Gary Dismukes  <dismukes@adacore.com>
 
-       * sem_ch12.adb (Analyze_Formal_Package_Declaration): Propagate
-       an aspect specification for Abstract_State from generic package
-       to formal package, so that it is available when analyzing the
-       constructed formal.
\ No newline at end of file
+       * sem_util.adb (Enclosing_Subprogram): Handle the case of
+       E_Entry_Family, returning the entry family's associated
+       Protected_Body_Subprogram (as was already done for E_Entry).
+       * exp_ch9.adb (Expand_N_Accept_Statement): Call Reset_Scopes_To
+       on the block created for an accept statement to reset the scopes
+       of any local entities to the block scope.
\ No newline at end of file
index 99bd8d211cb499f77446cbb8dac304f7ff3ee76a..720c1a9a23727ae50a3364085a35ce22dec51da6 100644 (file)
@@ -6624,6 +6624,13 @@ package body Exp_Ch9 is
              Declarations               => Declarations (N),
              Handled_Statement_Sequence => Build_Accept_Body (N));
 
+         --  Reset the Scope of local entities associated with the accept
+         --  statement (that currently reference the entry scope) to the
+         --  block scope, to avoid having references to the locals treated
+         --  as up-level references.
+
+         Reset_Scopes_To (Block, Blkent);
+
          --  For the analysis of the generated declarations, the parent node
          --  must be properly set.
 
index 95699199e3febd94c6beb9786a2eac3adac57c01..f4885735f3596de5ebb9f93957d1f01d13b20fbe 100644 (file)
@@ -6997,17 +6997,17 @@ package body Sem_Util is
       elsif Ekind_In (Dyn_Scop, E_Block, E_Loop, E_Return_Statement) then
          return Enclosing_Subprogram (Dyn_Scop);
 
-      elsif Ekind (Dyn_Scop) = E_Entry then
+      elsif Ekind_In (Dyn_Scop, E_Entry, E_Entry_Family) then
 
-         --  For a task entry, return the enclosing subprogram of the
-         --  task itself.
+         --  For a task entry or entry family, return the enclosing subprogram
+         --  of the task itself.
 
          if Ekind (Scope (Dyn_Scop)) = E_Task_Type then
             return Enclosing_Subprogram (Dyn_Scop);
 
-         --  A protected entry is rewritten as a protected procedure which is
-         --  the desired enclosing subprogram. This is relevant when unnesting
-         --  a procedure local to an entry body.
+         --  A protected entry or entry family is rewritten as a protected
+         --  procedure which is the desired enclosing subprogram. This is
+         --  relevant when unnesting a procedure local to an entry body.
 
          else
             return Protected_Body_Subprogram (Dyn_Scop);