aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEd Schonberg <schonberg@adacore.com>2018-08-21 14:47:56 +0000
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2018-08-21 14:47:56 +0000
commit5bb9ebcbc8270bcc08f955d196ad8c1bba003ec1 (patch)
tree6579c6e3a52da85f0b57e02dcc31038e72a8243c
parent6989a2bbfa259633296bf1e9f278ea83c5345811 (diff)
[Ada] Properly set scope of artificial entities in blocks
2018-08-21 Ed Schonberg <schonberg@adacore.com> gcc/ada/ * exp_ch9.adb (Expand_N_Timed_Entry_Call, Expand_Conditional_Entry_Call): Use Reset_Scopes_Of to set properly the scope of all entities created in blocks generated by the expansion of these constructs. From-SVN: r263730
-rw-r--r--gcc/ada/ChangeLog7
-rw-r--r--gcc/ada/exp_ch9.adb40
2 files changed, 36 insertions, 11 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 48974e7e41d..98045633fbf 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,5 +1,12 @@
2018-08-21 Ed Schonberg <schonberg@adacore.com>
+ * exp_ch9.adb (Expand_N_Timed_Entry_Call,
+ Expand_Conditional_Entry_Call): Use Reset_Scopes_Of to set
+ properly the scope of all entities created in blocks generated
+ by the expansion of these constructs.
+
+2018-08-21 Ed Schonberg <schonberg@adacore.com>
+
* sem_ch13.adb (Build_Predicate_Functioss): Apply
Reset_Quantified_Variables_Scope after predicate function has
been analyzed, so that the scope can be reset on the generated
diff --git a/gcc/ada/exp_ch9.adb b/gcc/ada/exp_ch9.adb
index d7e666309ab..c398948ed87 100644
--- a/gcc/ada/exp_ch9.adb
+++ b/gcc/ada/exp_ch9.adb
@@ -476,10 +476,11 @@ package body Exp_Ch9 is
-- ...
-- <actualN> := P.<formalN>;
- procedure Reset_Scopes_To (Proc_Body : Node_Id; E : Entity_Id);
- -- Reset the scope of declarations and blocks at the top level of Proc_Body
- -- to be E. Used after expanding entry bodies into their corresponding
- -- procedures. This is needed during unnesting to determine whether a
+ procedure Reset_Scopes_To (Bod : Node_Id; E : Entity_Id);
+ -- Reset the scope of declarations and blocks at the top level of Bod
+ -- to be E. Bod is either a block or a subprogram body. Used after
+ -- expanding various kinds of entry bodies into their corresponding
+ -- constructs. This is needed during unnesting to determine whether a
-- body geenrated for an entry or an accept alternative includes uplevel
-- references.
@@ -8240,6 +8241,7 @@ package body Exp_Ch9 is
end if;
Analyze (N);
+ Reset_Scopes_To (N, Entity (Identifier (N)));
end Expand_N_Conditional_Entry_Call;
---------------------------------------
@@ -12653,7 +12655,7 @@ package body Exp_Ch9 is
Expression => D_Disc));
-- Do the assignment at this stage only because the evaluation of the
- -- expression must not occur before (see ACVC C97302A).
+ -- expression must not occur earlier (see ACVC C97302A).
Append_To (Stmts,
Make_Assignment_Statement (Loc,
@@ -12850,7 +12852,7 @@ package body Exp_Ch9 is
end loop;
-- Do the assignment at this stage only because the evaluation
- -- of the expression must not occur before (see ACVC C97302A).
+ -- of the expression must not occur earlier (see ACVC C97302A).
Insert_Before (Stmt,
Make_Assignment_Statement (Loc,
@@ -12935,6 +12937,21 @@ package body Exp_Ch9 is
Make_Handled_Sequence_Of_Statements (Loc, Stmts)));
Analyze (N);
+
+ -- Some items in Decls used to be in the N_Block in E_Call that
+ -- is constructed in Expand_Entry_Call, and are now in the new
+ -- Block into which N has been rewritten. Adjust their scopes
+ -- to reflect that.
+
+ if Nkind (E_Call) = N_Block_Statement then
+ Obj := First_Entity (Entity (Identifier (E_Call)));
+ while Present (Obj) loop
+ Set_Scope (Obj, Entity (Identifier (N)));
+ Next_Entity (Obj);
+ end loop;
+ end if;
+
+ Reset_Scopes_To (N, Entity (Identifier (N)));
end Expand_N_Timed_Entry_Call;
----------------------------------------
@@ -14832,7 +14849,7 @@ package body Exp_Ch9 is
-- Reset_Scopes_To --
---------------------
- procedure Reset_Scopes_To (Proc_Body : Node_Id; E : Entity_Id) is
+ procedure Reset_Scopes_To (Bod : Node_Id; E : Entity_Id) is
function Reset_Scope (N : Node_Id) return Traverse_Result;
-- Temporaries may have been declared during expansion of the procedure
@@ -14853,7 +14870,8 @@ package body Exp_Ch9 is
-- If this is a block statement with an Identifier, it forms a scope,
-- so we want to reset its scope but not look inside.
- if Nkind (N) = N_Block_Statement
+ if N /= Bod
+ and then Nkind (N) = N_Block_Statement
and then Present (Identifier (N))
then
Set_Scope (Entity (Identifier (N)), E);
@@ -14868,7 +14886,7 @@ package body Exp_Ch9 is
Set_Scope (Defining_Entity (N), E);
return Skip;
- elsif N = Proc_Body then
+ elsif N = Bod then
-- Scan declarations in new body. Declarations in the statement
-- part will be handled during later traversal.
@@ -14879,7 +14897,7 @@ package body Exp_Ch9 is
Next (Decl);
end loop;
- elsif N /= Proc_Body and then Nkind (N) in N_Proper_Body then
+ elsif N /= Bod and then Nkind (N) in N_Proper_Body then
return Skip;
end if;
@@ -14889,7 +14907,7 @@ package body Exp_Ch9 is
-- Start of processing for Reset_Scopes_To
begin
- Reset_Scopes (Proc_Body);
+ Reset_Scopes (Bod);
end Reset_Scopes_To;
----------------------