From 5bb9ebcbc8270bcc08f955d196ad8c1bba003ec1 Mon Sep 17 00:00:00 2001 From: Ed Schonberg Date: Tue, 21 Aug 2018 14:47:56 +0000 Subject: [PATCH] [Ada] Properly set scope of artificial entities in blocks 2018-08-21 Ed Schonberg 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 --- gcc/ada/ChangeLog | 7 +++++++ gcc/ada/exp_ch9.adb | 40 +++++++++++++++++++++++++++++----------- 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,3 +1,10 @@ +2018-08-21 Ed Schonberg + + * 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 * sem_ch13.adb (Build_Predicate_Functioss): Apply 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 -- ... -- := P.; - 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; ---------------------- -- 2.30.2