public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r13-186] [Ada] Fix visibility inside declare_expression
@ 2022-05-09  9:31 Pierre-Marie de Rodat
  0 siblings, 0 replies; only message in thread
From: Pierre-Marie de Rodat @ 2022-05-09  9:31 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:5081e9205a6f12c41bdd5a7d630a732120fb4e92

commit r13-186-g5081e9205a6f12c41bdd5a7d630a732120fb4e92
Author: Ed Schonberg <schonberg@adacore.com>
Date:   Mon Jan 3 15:29:09 2022 +0100

    [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.

Diff:
---
 gcc/ada/sem_res.adb | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/gcc/ada/sem_res.adb b/gcc/ada/sem_res.adb
index b918615904e..f5c8b10456e 100644
--- a/gcc/ada/sem_res.adb
+++ b/gcc/ada/sem_res.adb
@@ -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);


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-05-09  9:31 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-09  9:31 [gcc r13-186] [Ada] Fix visibility inside declare_expression Pierre-Marie de Rodat

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).