https://gcc.gnu.org/g:29586bb60a34e884732d8e64d9c64cf74e2e9992

commit 29586bb60a34e884732d8e64d9c64cf74e2e9992
Author: Arthur Cohen <arthur.co...@embecosm.com>
Date:   Wed Mar 5 15:34:25 2025 +0000

    name-resolution: Handle let-else properly
    
    gcc/rust/ChangeLog:
    
            * resolve/rust-ast-resolve-stmt.h: Add handling for diverging else.
            * resolve/rust-late-name-resolver-2.0.cc (Late::visit): Likewise.

Diff:
---
 gcc/rust/resolve/rust-ast-resolve-stmt.h        | 7 ++++---
 gcc/rust/resolve/rust-late-name-resolver-2.0.cc | 3 +++
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/gcc/rust/resolve/rust-ast-resolve-stmt.h 
b/gcc/rust/resolve/rust-ast-resolve-stmt.h
index 5d5891043627..a1261a070c1c 100644
--- a/gcc/rust/resolve/rust-ast-resolve-stmt.h
+++ b/gcc/rust/resolve/rust-ast-resolve-stmt.h
@@ -73,9 +73,10 @@ public:
   void visit (AST::LetStmt &stmt) override
   {
     if (stmt.has_init_expr ())
-      {
-       ResolveExpr::go (stmt.get_init_expr (), prefix, canonical_prefix);
-      }
+      ResolveExpr::go (stmt.get_init_expr (), prefix, canonical_prefix);
+
+    if (stmt.has_else_expr ())
+      ResolveExpr::go (stmt.get_else_expr (), prefix, canonical_prefix);
 
     PatternDeclaration::go (stmt.get_pattern (), Rib::ItemType::Var);
     if (stmt.has_type ())
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 d1c10e51a082..5fcf0ec27cde 100644
--- a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
+++ b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
@@ -140,6 +140,9 @@ Late::visit (AST::LetStmt &let)
     visit (let.get_init_expr ());
   visit (let.get_pattern ());
 
+  if (let.has_else_expr ())
+    visit (let.get_init_expr ());
+
   // how do we deal with the fact that `let a = blipbloup` should look for a
   // label and cannot go through function ribs, but `let a = blipbloup()` can?

Reply via email to