]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: nr2.0: Fix closure parameter scoping
authorOwen Avery <powerboat9.gamer@gmail.com>
Thu, 15 May 2025 01:40:04 +0000 (21:40 -0400)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 5 Aug 2025 14:36:45 +0000 (16:36 +0200)
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.gamer@gmail.com>
gcc/rust/resolve/rust-default-resolver.cc
gcc/rust/resolve/rust-default-resolver.h
gcc/rust/resolve/rust-late-name-resolver-2.0.cc
gcc/rust/resolve/rust-late-name-resolver-2.0.h

index 969711c29950c53bc59791b6038a46b894d3f656..01906cf0a32dab57cf3eb0417a05464c3f79a9a7 100644 (file)
@@ -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
index e80d77440b15b785d4a97ad6f0a8d9108eef9b14..99fd8e77a48dc984642ac3ad4402e07b1525af05 100644 (file)
@@ -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;
index 51874bbb56263dbbe452dd6cad501599cb7ff34e..3c1c346cf1472b712320652dead301406e405b13 100644 (file)
@@ -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
index ddf14ff494099dec5b6ba107f9c98fa39264cf00..f2907c90514ecc7fe373bd01985c74bd8bbc5e11 100644 (file)
@@ -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);