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]>
---
 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 9b4f1582219..098c81e9b17 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 a9b8d1510c9..55ae2b15f23 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 00000000000..da7c84132ba
--- /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 e0ef6da1a10..857d5c84c49 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
 }
-- 
2.50.1

Reply via email to