https://gcc.gnu.org/g:1c22584fee97eab077c263e90c7ac6355ad42e15
commit r16-2922-g1c22584fee97eab077c263e90c7ac6355ad42e15 Author: Arthur Cohen <arthur.co...@embecosm.com> Date: Fri Jul 4 15:40:02 2025 +0200 gccrs: nr2.0: Add proper handling for WhileLet loops. gcc/rust/ChangeLog: * resolve/rust-late-name-resolver-2.0.cc (Late::visit): New visitor. * resolve/rust-late-name-resolver-2.0.h: Declare it. * resolve/rust-name-resolution-context.h (enum class): New binding context. Diff: --- gcc/rust/resolve/rust-late-name-resolver-2.0.cc | 23 +++++++++++++++++++++++ gcc/rust/resolve/rust-late-name-resolver-2.0.h | 1 + gcc/rust/resolve/rust-name-resolution-context.h | 1 + 3 files changed, 25 insertions(+) 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 3f6e432b8512..76fd2bd17aa8 100644 --- a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc +++ b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc @@ -19,6 +19,7 @@ #include "optional.h" #include "rust-ast-full.h" #include "rust-diagnostics.h" +#include "rust-expr.h" #include "rust-hir-map.h" #include "rust-late-name-resolver-2.0.h" #include "rust-default-resolver.h" @@ -208,6 +209,28 @@ Late::visit (AST::LetStmt &let) // let.get_node_id (), [] () {}); } +void +Late::visit (AST::WhileLetLoopExpr &while_let) +{ + DefaultASTVisitor::visit_outer_attrs (while_let); + + if (while_let.has_loop_label ()) + visit (while_let.get_loop_label ()); + + // visit expression before pattern + // this makes variable shadowing work properly + visit (while_let.get_scrutinee_expr ()); + + ctx.bindings.enter (BindingSource::WhileLet); + + for (auto &pattern : while_let.get_patterns ()) + visit (pattern); + + ctx.bindings.exit (); + + visit (while_let.get_loop_block ()); +} + static void visit_identifier_as_pattern (NameResolutionContext &ctx, const Identifier &ident, location_t locus, 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 65af6139e80a..95540e340053 100644 --- a/gcc/rust/resolve/rust-late-name-resolver-2.0.h +++ b/gcc/rust/resolve/rust-late-name-resolver-2.0.h @@ -42,6 +42,7 @@ public: // some more label declarations void visit (AST::LetStmt &) override; + void visit (AST::WhileLetLoopExpr &) override; // TODO: Do we need this? // void visit (AST::Method &) override; void visit (AST::IdentifierPattern &) override; diff --git a/gcc/rust/resolve/rust-name-resolution-context.h b/gcc/rust/resolve/rust-name-resolution-context.h index 0180919db7e7..558b3cab6647 100644 --- a/gcc/rust/resolve/rust-name-resolution-context.h +++ b/gcc/rust/resolve/rust-name-resolution-context.h @@ -198,6 +198,7 @@ enum class BindingSource Match, Let, IfLet, + WhileLet, For, /* Closure param or function param */ Param