https://gcc.gnu.org/g:a709ad493aba4eb5701e22c8abb6585b7963035f

commit r16-2844-ga709ad493aba4eb5701e22c8abb6585b7963035f
Author: Owen Avery <powerboat9.ga...@gmail.com>
Date:   Wed May 14 21:40:04 2025 -0400

    gccrs: nr2.0: Fix closure parameter scoping
    
    gcc/rust/ChangeLog:
    
            * resolve/rust-default-resolver.cc
            (DefaultResolver::visit_closure_params): New member function
            definition.
            (DefaultResolver::visit): New visiting function definition for
            ClosureExpr called from visiting functions for ClosureExprInner
            and ClosureExprInnerTyped.
            * resolve/rust-default-resolver.h
            (DefaultResolver::visit_closure_params): New member function
            declaration.
            (DefaultResolver::visit): New visiting function declaration for
            ClosureExpr.
            * resolve/rust-late-name-resolver-2.0.cc (add_captures): Remove
            function.
            (Late::visit): New visiting function definition for ClosureExpr,
            remove visiting function definitions for ClosureExprInner and
            ClosureExprInnerTyped.
            (Late::visit_closure_params): New member function definition.
            * resolve/rust-late-name-resolver-2.0.h (Late::visit): New
            visiting function declaration for ClosureExpr, remove visiting
            function declarations for ClosureExprInner and
            ClosureExprInnerTyped.
            (Late::visit_closure_params): New member function declaration.
    
    Signed-off-by: Owen Avery <powerboat9.ga...@gmail.com>

Diff:
---
 gcc/rust/resolve/rust-default-resolver.cc       | 25 ++++++++++++--
 gcc/rust/resolve/rust-default-resolver.h        |  2 ++
 gcc/rust/resolve/rust-late-name-resolver-2.0.cc | 44 ++++++-------------------
 gcc/rust/resolve/rust-late-name-resolver-2.0.h  |  4 +--
 4 files changed, 37 insertions(+), 38 deletions(-)

diff --git a/gcc/rust/resolve/rust-default-resolver.cc 
b/gcc/rust/resolve/rust-default-resolver.cc
index 969711c29950..01906cf0a32d 100644
--- a/gcc/rust/resolve/rust-default-resolver.cc
+++ b/gcc/rust/resolve/rust-default-resolver.cc
@@ -292,13 +292,33 @@ DefaultResolver::visit (AST::TypeAlias &type)
              inner_fn_2, type.get_new_type_name ());
 }
 
+void
+DefaultResolver::visit_closure_params (AST::ClosureExpr &expr)
+{
+  for (auto &param : expr.get_params ())
+    visit (param);
+}
+
+void
+DefaultResolver::visit (AST::ClosureExpr &expr)
+{
+  auto expr_fn = [this, &expr] () {
+    visit_closure_params (expr);
+    visit (expr.get_definition_expr ());
+  };
+
+  visit_outer_attrs (expr);
+
+  ctx.scoped (Rib::Kind::Normal, expr.get_node_id (), expr_fn);
+}
+
 void
 DefaultResolver::visit (AST::ClosureExprInner &expr)
 {
   if (expr.is_marked_for_strip ())
     return;
 
-  AST::DefaultASTVisitor::visit (expr);
+  visit (static_cast<AST::ClosureExpr &> (expr));
 }
 
 void
@@ -307,7 +327,8 @@ DefaultResolver::visit (AST::ClosureExprInnerTyped &expr)
   if (expr.is_marked_for_strip ())
     return;
 
-  AST::DefaultASTVisitor::visit (expr);
+  visit (static_cast<AST::ClosureExpr &> (expr));
+  visit (expr.get_return_type ());
 }
 
 void
diff --git a/gcc/rust/resolve/rust-default-resolver.h 
b/gcc/rust/resolve/rust-default-resolver.h
index e80d77440b15..99fd8e77a48d 100644
--- a/gcc/rust/resolve/rust-default-resolver.h
+++ b/gcc/rust/resolve/rust-default-resolver.h
@@ -70,6 +70,8 @@ public:
   void visit (AST::TypeAlias &) override;
 
   // Visitors that visit their expression node(s)
+  virtual void visit_closure_params (AST::ClosureExpr &);
+  virtual void visit (AST::ClosureExpr &);
   void visit (AST::ClosureExprInner &) override;
   void visit (AST::ClosureExprInnerTyped &) override;
   void visit (AST::MatchExpr &) override;
diff --git a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc 
b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
index 51874bbb5626..3c1c346cf147 100644
--- a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
+++ b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
@@ -693,51 +693,27 @@ Late::visit (AST::GenericArg &arg)
   DefaultResolver::visit (arg);
 }
 
-template <class Closure>
-static void
-add_captures (Closure &closure, NameResolutionContext &ctx)
-{
-  auto vals = ctx.values.peek ().get_values ();
-  for (auto &val : vals)
-    {
-      ctx.mappings.add_capture (closure.get_node_id (),
-                               val.second.get_node_id ());
-    }
-}
-
 void
-Late::visit (AST::ClosureExprInner &closure)
+Late::visit_closure_params (AST::ClosureExpr &closure)
 {
-  add_captures (closure, ctx);
-
-  visit_outer_attrs (closure);
-
   ctx.bindings.enter (BindingSource::Param);
 
-  for (auto &param : closure.get_params ())
-    visit (param);
+  DefaultResolver::visit_closure_params (closure);
 
   ctx.bindings.exit ();
-
-  visit (closure.get_definition_expr ());
 }
 
 void
-Late::visit (AST::ClosureExprInnerTyped &closure)
+Late::visit (AST::ClosureExpr &expr)
 {
-  add_captures (closure, ctx);
-
-  visit_outer_attrs (closure);
-
-  ctx.bindings.enter (BindingSource::Param);
-
-  for (auto &param : closure.get_params ())
-    visit (param);
-
-  ctx.bindings.exit ();
+  // add captures
+  auto vals = ctx.values.peek ().get_values ();
+  for (auto &val : vals)
+    {
+      ctx.mappings.add_capture (expr.get_node_id (), val.second.get_node_id 
());
+    }
 
-  visit (closure.get_return_type ());
-  visit (closure.get_definition_expr ());
+  DefaultResolver::visit (expr);
 }
 
 } // namespace Resolver2_0
diff --git a/gcc/rust/resolve/rust-late-name-resolver-2.0.h 
b/gcc/rust/resolve/rust-late-name-resolver-2.0.h
index ddf14ff49409..f2907c90514e 100644
--- a/gcc/rust/resolve/rust-late-name-resolver-2.0.h
+++ b/gcc/rust/resolve/rust-late-name-resolver-2.0.h
@@ -69,8 +69,8 @@ public:
   void visit (AST::StructStruct &) override;
   void visit (AST::GenericArgs &) override;
   void visit (AST::GenericArg &);
-  void visit (AST::ClosureExprInner &) override;
-  void visit (AST::ClosureExprInnerTyped &) override;
+  void visit_closure_params (AST::ClosureExpr &) override;
+  void visit (AST::ClosureExpr &) override;
 
 private:
   void resolve_label (AST::Lifetime &lifetime);

Reply via email to