[COMMITTED 21/77] gccrs: Fix IdentifierPathPass on sub-patterns

[email protected]
Newsgroups gmane.comp.gcc.patches,gmane.comp.gcc.rust
Message-ID <[email protected]>
From: Owen Avery <[email protected]>

gcc/rust/ChangeLog:

	* resolve/rust-identifier-path.cc
	(IdentifierPathPass::reseat (Pattern)): Remember to visit a
	pattern's sub-patterns, if we didn't convert it into a
	PathInExpression.

gcc/testsuite/ChangeLog:

	* rust/execute/ident_pat_vs_path_3.rs: New test.

Signed-off-by: Owen Avery <[email protected]>
---
 gcc/rust/resolve/rust-identifier-path.cc      | 17 ++++++++----
 .../rust/execute/ident_pat_vs_path_3.rs       | 27 +++++++++++++++++++
 2 files changed, 39 insertions(+), 5 deletions(-)
 create mode 100644 gcc/testsuite/rust/execute/ident_pat_vs_path_3.rs

diff --git a/gcc/rust/resolve/rust-identifier-path.cc b/gcc/rust/resolve/rust-identifier-path.cc
index 30223a7b3d6..414171bae87 100644
--- a/gcc/rust/resolve/rust-identifier-path.cc
+++ b/gcc/rust/resolve/rust-identifier-path.cc
@@ -39,11 +39,14 @@ IdentifierPathPass::go (AST::Crate &crate, NameResolutionContext &ctx,
 void
 IdentifierPathPass::reseat (std::unique_ptr<AST::Pattern> &ptr)
 {
-  AST::IdentifierPattern *ident_pat;
-  if (ptr->get_pattern_kind () == AST::Pattern::Kind::Identifier)
-    ident_pat = static_cast<AST::IdentifierPattern *> (ptr.get ());
-  else
-    return;
+  if (ptr->get_pattern_kind () != AST::Pattern::Kind::Identifier)
+    {
+      // bail out, but make sure to still visit
+      visit (ptr);
+      return;
+    }
+
+  auto ident_pat = static_cast<AST::IdentifierPattern *> (ptr.get ());
 
   if (ident_path_to_convert.find (ident_pat->get_node_id ())
       != ident_path_to_convert.end ())
@@ -55,6 +58,10 @@ IdentifierPathPass::reseat (std::unique_ptr<AST::Pattern> &ptr)
 	std::move (segments), std::vector<AST::Attribute> (),
 	ident_pat->get_locus ());
     }
+  else
+    {
+      visit (ptr);
+    }
 }
 
 } // namespace Resolver2_0
diff --git a/gcc/testsuite/rust/execute/ident_pat_vs_path_3.rs b/gcc/testsuite/rust/execute/ident_pat_vs_path_3.rs
new file mode 100644
index 00000000000..fcc2cc3d5c5
--- /dev/null
+++ b/gcc/testsuite/rust/execute/ident_pat_vs_path_3.rs
@@ -0,0 +1,27 @@
+// { dg-additional-options "-w" }
+#![feature(no_core)]
+#![no_core]
+
+enum E {
+    A,
+    B,
+    C
+}
+
+fn main() -> i32 {
+    use E::C;
+
+    let v1 = match (E::A,) {
+        (C,) => 1,
+        (E::A,) => 0,
+        (E::B,) => 1
+    };
+
+    let v2 = match (E::A,) {
+        (B,) => 0,
+        (E::A,) => 1,
+        (C,) => 1
+    };
+
+    v1 + v2
+}
-- 
2.50.1
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.