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 ¶m : 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 ¶m : 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 ¶m : 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);