[gcc r16-8219] gccrs: Fix match arm scope

Arthur Cohen cohenarthur@gcc.gnu.org
Fri Mar 20 17:25:00 GMT 2026


https://gcc.gnu.org/g:adaac1251b5f7a6e3673d252ee172eaad7b64d6b

commit r16-8219-gadaac1251b5f7a6e3673d252ee172eaad7b64d6b
Author: Owen Avery <powerboat9.gamer@gmail.com>
Date:   Tue Mar 3 01:04:34 2026 -0500

    gccrs: Fix match arm scope
    
    gcc/rust/ChangeLog:
    
            * resolve/rust-default-resolver.cc (DefaultResolver::visit):
            Override MatchCase visiting function.
            * resolve/rust-default-resolver.h (DefaultResolver::visit):
            Likewise.
    
    gcc/testsuite/ChangeLog:
    
            * rust/execute/torture/match-structpattern-tuplefield.rs: Fix
            test.
            * rust/compile/match-scope.rs: New test.
    
    Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>

Diff:
---
 gcc/rust/resolve/rust-default-resolver.cc                         | 8 ++++++++
 gcc/rust/resolve/rust-default-resolver.h                          | 1 +
 gcc/testsuite/rust/compile/match-scope.rs                         | 8 ++++++++
 .../rust/execute/torture/match-structpattern-tuplefield.rs        | 5 +++--
 4 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/gcc/rust/resolve/rust-default-resolver.cc b/gcc/rust/resolve/rust-default-resolver.cc
index 9b4f15822199..098c81e9b17e 100644
--- a/gcc/rust/resolve/rust-default-resolver.cc
+++ b/gcc/rust/resolve/rust-default-resolver.cc
@@ -389,6 +389,14 @@ DefaultResolver::visit (AST::MatchExpr &expr)
   AST::DefaultASTVisitor::visit (expr);
 }
 
+void
+DefaultResolver::visit (AST::MatchCase &cas)
+{
+  auto vis = [this, &cas] () { AST::DefaultASTVisitor::visit (cas); };
+
+  ctx.scoped (Rib::Kind::Normal, cas.get_node_id (), vis);
+}
+
 void
 DefaultResolver::visit (AST::ConstantItem &item)
 {
diff --git a/gcc/rust/resolve/rust-default-resolver.h b/gcc/rust/resolve/rust-default-resolver.h
index a9b8d1510c9a..55ae2b15f235 100644
--- a/gcc/rust/resolve/rust-default-resolver.h
+++ b/gcc/rust/resolve/rust-default-resolver.h
@@ -79,6 +79,7 @@ public:
   void visit (AST::ClosureExprInner &) override;
   void visit (AST::ClosureExprInnerTyped &) override;
   void visit (AST::MatchExpr &) override;
+  void visit (AST::MatchCase &) override;
 
   // Leaf visitors, which do nothing by default
   void visit (AST::ConstantItem &) override;
diff --git a/gcc/testsuite/rust/compile/match-scope.rs b/gcc/testsuite/rust/compile/match-scope.rs
new file mode 100644
index 000000000000..da7c84132baa
--- /dev/null
+++ b/gcc/testsuite/rust/compile/match-scope.rs
@@ -0,0 +1,8 @@
+#![no_core]
+
+pub fn main() -> i32 {
+    match 12 {
+        x => {}
+    }
+    x // { dg-error "cannot find value 'x'" }
+}
diff --git a/gcc/testsuite/rust/execute/torture/match-structpattern-tuplefield.rs b/gcc/testsuite/rust/execute/torture/match-structpattern-tuplefield.rs
index e0ef6da1a107..857d5c84c49c 100644
--- a/gcc/testsuite/rust/execute/torture/match-structpattern-tuplefield.rs
+++ b/gcc/testsuite/rust/execute/torture/match-structpattern-tuplefield.rs
@@ -5,9 +5,10 @@ pub struct TupStruct (i32, i32);
 
 pub fn main() -> i32 {
     let mut t = TupStruct (1, 1);
+    let mut ret = 1;
     match t {
-        TupStruct { 0: 1, 1: b } => { b -= 1 }
+        TupStruct { 0: 1, 1: b } => { b -= 1; ret = b }
         _ => {}
     }
-    b
+    ret
 }


More information about the Gcc-cvs mailing list