diff --git a/gcc/rust/resolve/rust-default-resolver.cc b/gcc/rust/resolve/rust-default-resolver.cc index f1c0e5caffe8..a225400c289c 100644 --- a/gcc/rust/resolve/rust-default-resolver.cc +++ b/gcc/rust/resolve/rust-default-resolver.cc @@ -81,11 +81,29 @@ DefaultResolver::visit (AST::Function &function) function.get_function_name ()); } +void +DefaultResolver::visit_for_pattern (AST::Pattern &pat) +{ + visit (pat); +} + void DefaultResolver::visit (AST::ForLoopExpr &expr) { - ctx.scoped (Rib::Kind::Normal, expr.get_node_id (), - [this, &expr] () { AST::DefaultASTVisitor::visit (expr); }); + visit_outer_attrs (expr); + + visit (expr.get_iterator_expr ()); + + auto vis_method = [this, &expr] () { + visit_for_pattern (expr.get_pattern ()); + + if (expr.has_loop_label ()) + visit (expr.get_loop_label ()); + + visit (expr.get_loop_block ()); + }; + + ctx.scoped (Rib::Kind::Normal, expr.get_node_id (), vis_method); } void diff --git a/gcc/rust/resolve/rust-default-resolver.h b/gcc/rust/resolve/rust-default-resolver.h index cf0df68595f0..3903382ea809 100644 --- a/gcc/rust/resolve/rust-default-resolver.h +++ b/gcc/rust/resolve/rust-default-resolver.h @@ -46,6 +46,7 @@ class DefaultResolver : public AST::DefaultASTVisitor void visit (AST::BlockExpr &) override; void visit (AST::Module &) override; void visit (AST::Function &) override; + virtual void visit_for_pattern (AST::Pattern &); void visit (AST::ForLoopExpr &expr) override; virtual void visit_if_let_patterns (AST::IfLetExpr &expr); void visit (AST::IfLetExpr &expr) 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 6effb7af42f1..4cbe8dbbf0c7 100644 --- a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc +++ b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc @@ -58,22 +58,13 @@ Late::new_label (Identifier name, NodeId id) } void -Late::visit (AST::ForLoopExpr &expr) +Late::visit_for_pattern (AST::Pattern &pat) { - visit_outer_attrs (expr); - ctx.bindings.enter (BindingSource::For); - visit (expr.get_pattern ()); + visit (pat); ctx.bindings.exit (); - - visit (expr.get_iterator_expr ()); - - if (expr.has_loop_label ()) - visit (expr.get_loop_label ()); - - visit (expr.get_loop_block ()); } void 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 608ae38eb5c1..f92536fe4eab 100644 --- a/gcc/rust/resolve/rust-late-name-resolver-2.0.h +++ b/gcc/rust/resolve/rust-late-name-resolver-2.0.h @@ -50,7 +50,7 @@ class Late : public DefaultResolver void visit (AST::AltPattern &) override; void visit (AST::SelfParam &) override; void visit (AST::MatchArm &) override; - void visit (AST::ForLoopExpr &) override; + void visit_for_pattern (AST::Pattern &) override; void visit_if_let_patterns (AST::IfLetExpr &) override; // resolutions