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

Reply via email to