[Ada] Fix visibility inside declare_expression
The first implementation just created a scope for the analysis of the declarations and the expression, so that visibility would just work as it does for all other constructs. However this led to an annoying bug when one of the declarations or the expression itself creates a transient scope: there may be a confusion on scope exit between those two scopes. As a result visibility is handled by explicit traversal of the expression and replacement of occurrences of the local variables, see Replace_Local_Ref in Resolve_Declare_Expression (sem_res.adb). The current code does not take into account that there may be references to a local object in a subsequent declaration (not just in the expression). gcc/ada/ * sem_res.adb (Resolve_Declare_Expression): Traverse the expression to replace references to local variables that occur within declarations of the declare_expression; fix typos in comments.
This commit is contained in:
parent
f1231d9a0b
commit
5081e9205a
1 changed files with 15 additions and 2 deletions
|
@ -7595,7 +7595,7 @@ package body Sem_Res is
|
|||
Local : Entity_Id := Empty;
|
||||
|
||||
function Replace_Local (N : Node_Id) return Traverse_Result;
|
||||
-- Use a tree traversal to replace each ocurrence of the name of
|
||||
-- Use a tree traversal to replace each occurrence of the name of
|
||||
-- a local object declared in the construct, with the corresponding
|
||||
-- entity. This replaces the usual way to perform name capture by
|
||||
-- visibility, because it is not possible to place on the scope
|
||||
|
@ -7632,7 +7632,7 @@ package body Sem_Res is
|
|||
|
||||
procedure Replace_Local_Ref is new Traverse_Proc (Replace_Local);
|
||||
|
||||
-- Start of processing for Resolve_Declare_Expression
|
||||
-- Start of processing for Resolve_Declare_Expression
|
||||
|
||||
begin
|
||||
|
||||
|
@ -7645,6 +7645,19 @@ package body Sem_Res is
|
|||
then
|
||||
Local := Defining_Identifier (Decl);
|
||||
Replace_Local_Ref (Expr);
|
||||
|
||||
-- Traverse the expression to replace references to local
|
||||
-- variables that occur within declarations of the
|
||||
-- declare_expression.
|
||||
|
||||
declare
|
||||
D : Node_Id := Next (Decl);
|
||||
begin
|
||||
while Present (D) loop
|
||||
Replace_Local_Ref (D);
|
||||
Next (D);
|
||||
end loop;
|
||||
end;
|
||||
end if;
|
||||
|
||||
Next (Decl);
|
||||
|
|
Loading…
Add table
Reference in a new issue