[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