From: Owen Avery <[email protected]>

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 <[email protected]>
---
This change was merged into the gccrs repository and is posted here for
upstream visibility and potential drive-by review, as requested by GCC
release managers.
Each commit email contains a link to its details on github from where you can
find the Pull-Request and associated discussions.


Commit on github: 
https://github.com/Rust-GCC/gccrs/commit/fd8acf80ceca1b2d3ca73c2ddb81f78a4aa93b24

The commit has been mentioned in the following pull-request(s):
 - https://github.com/Rust-GCC/gccrs/pull/4460

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

diff --git a/gcc/rust/resolve/rust-default-resolver.cc 
b/gcc/rust/resolve/rust-default-resolver.cc
index 9b4f15822..098c81e9b 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 a9b8d1510..55ae2b15f 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 000000000..da7c84132
--- /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 e0ef6da1a..857d5c84c 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
 }

base-commit: 6b891ee3e6b879e402b037c1322a8350c72b7798
-- 
2.53.0

Reply via email to