]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: parser: Parse reference patterns correctly
authorArthur Cohen <arthur.cohen@embecosm.com>
Wed, 19 Apr 2023 15:40:15 +0000 (17:40 +0200)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 17:34:10 +0000 (18:34 +0100)
Reference patterns cannot contain AltPatterns per the Rust reference,
so we should not call into `parse_pattern` to parse the referenced pattern,
but rather the more restrictive `parse_pattern_no_alt`.

gcc/rust/ChangeLog:

* parse/rust-parse-impl.h (Parser::parse_reference_pattern): Do not
call into `parse_pattern` anymore.

gcc/testsuite/ChangeLog:

* rust/compile/issue-1807.rs: New test.

gcc/rust/parse/rust-parse-impl.h
gcc/testsuite/rust/compile/issue-1807.rs [new file with mode: 0644]

index 13f05419f41de5e506e9cf477f21787823b426eb..c3aeda2e7c0b01a2c2aa11380515509213a75793 100644 (file)
@@ -10949,7 +10949,7 @@ Parser<ManagedTokenSource>::parse_reference_pattern ()
     }
 
   // parse pattern to get reference of (required)
-  std::unique_ptr<AST::Pattern> pattern = parse_pattern ();
+  std::unique_ptr<AST::Pattern> pattern = parse_pattern_no_alt ();
   if (pattern == nullptr)
     {
       Error error (lexer.peek_token ()->get_locus (),
diff --git a/gcc/testsuite/rust/compile/issue-1807.rs b/gcc/testsuite/rust/compile/issue-1807.rs
new file mode 100644 (file)
index 0000000..fe821f0
--- /dev/null
@@ -0,0 +1,6 @@
+// { dg-additional-options "-fsyntax-only" }
+
+fn main() {
+    let is_zero = &|&&d: &&u8| -> bool { d == b'0' };
+    let lambda = |&c| c != b'9';
+}