From: Arthur Cohen <arthur.co...@embecosm.com>

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.
---
 .../resolve/rust-late-name-resolver-2.0.cc    | 23 +++++++++++++++++++
 .../resolve/rust-late-name-resolver-2.0.h     |  1 +
 .../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 3f6e432b851..76fd2bd17aa 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 65af6139e80..95540e34005 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 0180919db7e..558b3cab664 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
-- 
2.49.0

Reply via email to