From: Owen Avery Date: Thu, 15 May 2025 00:03:01 +0000 (-0400) Subject: nr2.0: Fix IfLet pattern handling X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ba32a6e460813a94e5f129dbc0e259c300690385;p=thirdparty%2Fgcc.git nr2.0: Fix IfLet pattern handling gcc/rust/ChangeLog: * resolve/rust-default-resolver.cc (DefaultResolver::visit_if_let_patterns): New function definition. (DefaultResolver::visit): New IfLetExpr visitor definition. * resolve/rust-default-resolver.h (DefaultResolver::visit_if_let_patterns): New function declaration. (DefaultResolver::visit): New IfLetExpr visitor declaration. * resolve/rust-late-name-resolver-2.0.cc (Late::visit): Remove IfLetExpr visitor definition. (Late::visit_if_let_patterns): New function definition. * resolve/rust-late-name-resolver-2.0.h (Late::visit): Remove IfLetExpr visitor declaration. (Late::visit_if_let_patterns): New function declaration. * resolve/rust-name-resolution-context.h (BindingSource::IfLet): New enumerator. Signed-off-by: Owen Avery --- diff --git a/gcc/rust/resolve/rust-default-resolver.cc b/gcc/rust/resolve/rust-default-resolver.cc index 7d8029fe3bf..2dafa8861f6 100644 --- a/gcc/rust/resolve/rust-default-resolver.cc +++ b/gcc/rust/resolve/rust-default-resolver.cc @@ -60,6 +60,28 @@ DefaultResolver::visit (AST::ForLoopExpr &expr) [this, &expr] () { AST::DefaultASTVisitor::visit (expr); }); } +void +DefaultResolver::visit_if_let_patterns (AST::IfLetExpr &expr) +{ + for (auto &pattern : expr.get_patterns ()) + visit (pattern); +} + +void +DefaultResolver::visit (AST::IfLetExpr &expr) +{ + auto inner_vis = [this, &expr] () { + visit_if_let_patterns (expr); + visit (expr.get_if_block ()); + }; + + visit_outer_attrs (expr); + + visit (expr.get_value_expr ()); + + ctx.scoped (Rib::Kind::Normal, expr.get_node_id (), inner_vis); +} + void DefaultResolver::visit (AST::Trait &trait) { diff --git a/gcc/rust/resolve/rust-default-resolver.h b/gcc/rust/resolve/rust-default-resolver.h index 14ada236b7a..6fa977b26a7 100644 --- a/gcc/rust/resolve/rust-default-resolver.h +++ b/gcc/rust/resolve/rust-default-resolver.h @@ -46,6 +46,8 @@ public: void visit (AST::Module &) override; void visit (AST::Function &) override; void visit (AST::ForLoopExpr &expr) override; + virtual void visit_if_let_patterns (AST::IfLetExpr &expr); + void visit (AST::IfLetExpr &expr) override; void visit (AST::Trait &) override; // used to handle Self insertion in TopLevel virtual void maybe_insert_big_self (AST::Impl &) {} 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 4ed5528c911..da6820e02ff 100644 --- a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc +++ b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc @@ -147,19 +147,13 @@ Late::visit (AST::ForLoopExpr &expr) } void -Late::visit (AST::IfLetExpr &expr) +Late::visit_if_let_patterns (AST::IfLetExpr &expr) { - visit_outer_attrs (expr); + ctx.bindings.enter (BindingSource::IfLet); - ctx.bindings.enter (BindingSource::Let); - - for (auto &pattern : expr.get_patterns ()) - visit (pattern); + DefaultResolver::visit_if_let_patterns (expr); ctx.bindings.exit (); - - visit (expr.get_value_expr ()); - visit (expr.get_if_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 896b72ce439..6b777cc76d6 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 @@ public: void visit (AST::SelfParam &) override; void visit (AST::MatchArm &) override; void visit (AST::ForLoopExpr &) override; - void visit (AST::IfLetExpr &) override; + void visit_if_let_patterns (AST::IfLetExpr &) override; // resolutions void visit (AST::IdentifierExpr &) override; diff --git a/gcc/rust/resolve/rust-name-resolution-context.h b/gcc/rust/resolve/rust-name-resolution-context.h index aab04ccc18e..6d990fd6076 100644 --- a/gcc/rust/resolve/rust-name-resolution-context.h +++ b/gcc/rust/resolve/rust-name-resolution-context.h @@ -177,6 +177,7 @@ enum class BindingSource { Match, Let, + IfLet, For, /* Closure param or function param */ Param