]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: nr2.0: Fix IfLet pattern handling
authorOwen Avery <powerboat9.gamer@gmail.com>
Thu, 15 May 2025 00:03:01 +0000 (20:03 -0400)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 5 Aug 2025 14:36:44 +0000 (16:36 +0200)
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 <powerboat9.gamer@gmail.com>
gcc/rust/resolve/rust-default-resolver.cc
gcc/rust/resolve/rust-default-resolver.h
gcc/rust/resolve/rust-late-name-resolver-2.0.cc
gcc/rust/resolve/rust-late-name-resolver-2.0.h
gcc/rust/resolve/rust-name-resolution-context.h

index dce5aaa6a11a02c4de63568cf685cea93386def4..12f6e1c83349017aebca5c80de758dbd63037b4c 100644 (file)
@@ -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)
 {
index 87281377d70f0156546906c7957679029d644204..639e87113d4b5673fd6c47a2d7f39762fbb1992f 100644 (file)
@@ -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 &) {}
index 401d26634c5b38e18cbecffad134b18f8d203b79..3bb364e071dcf4636e450c040a759741707f889f 100644 (file)
@@ -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
index 171d9bfe0f6e231816c0298785b5f6d910c22ce7..4b7b1b8741123142c265cb0e27b79219f008f4f8 100644 (file)
@@ -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;
index 19ba750768692a70b66fe56579769ad5b9a42f55..cf87c8f1c79b3bcad39690f088d68ec78418af4a 100644 (file)
@@ -177,6 +177,7 @@ enum class BindingSource
 {
   Match,
   Let,
+  IfLet,
   For,
   /* Closure param or function param */
   Param