aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOwen Avery <powerboat9.gamer@gmail.com>2023-02-14 18:42:39 -0500
committerArthur Cohen <arthur.cohen@embecosm.com>2024-01-16 16:23:02 +0100
commit4bd09ce06f50d266c992c984cc993384d5e6655e (patch)
treed3ddea29da0deaaecf7cf09e93b7a75d0af12aba
parent7a6906c8d80e437a97c780370a8fec4e00561c7b (diff)
downloadgcc-4bd09ce06f50d266c992c984cc993384d5e6655e.zip
gcc-4bd09ce06f50d266c992c984cc993384d5e6655e.tar.gz
gcc-4bd09ce06f50d266c992c984cc993384d5e6655e.tar.bz2
gccrs: Parse AltPattern
Renamed Parser::parse_pattern to Parser::parse_pattern_no_alt and created new method Parser::parse_pattern to handle alternate patterns. gcc/rust/ChangeLog: * parse/rust-parse-impl.h (Parser::parse_pattern): Add. (Parser::parse_pattern_no_alt): Rename. * parse/rust-parse.h: (Parser::parse_pattern): Add. (Parser::parse_pattern_no_alt): Rename. gcc/testsuite/ChangeLog: * rust/compile/pattern-or.rs: New test. Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
-rw-r--r--gcc/rust/parse/rust-parse-impl.h33
-rw-r--r--gcc/rust/parse/rust-parse.h1
-rw-r--r--gcc/testsuite/rust/compile/pattern-or.rs7
3 files changed, 40 insertions, 1 deletions
diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h
index ef0eaef..d1f192e 100644
--- a/gcc/rust/parse/rust-parse-impl.h
+++ b/gcc/rust/parse/rust-parse-impl.h
@@ -10619,11 +10619,42 @@ Parser<ManagedTokenSource>::parse_range_pattern_bound ()
}
}
-// Parses a pattern (will further disambiguate any pattern).
template <typename ManagedTokenSource>
std::unique_ptr<AST::Pattern>
Parser<ManagedTokenSource>::parse_pattern ()
{
+ Location start_locus = lexer.peek_token ()->get_locus ();
+
+ /* skip optional starting pipe */
+ maybe_skip_token (PIPE);
+
+ auto first = parse_pattern_no_alt ();
+
+ if (lexer.peek_token ()->get_id () != PIPE)
+ /* no alternates */
+ return first;
+
+ std::vector<std::unique_ptr<AST::Pattern>> alts;
+ alts.push_back (std::move (first));
+
+ do
+ {
+ lexer.skip_token ();
+ alts.push_back (parse_pattern_no_alt ());
+ }
+ while (lexer.peek_token ()->get_id () == PIPE);
+
+ /* alternates */
+ return std::unique_ptr<AST::Pattern> (
+ new AST::AltPattern (std::move (alts), start_locus));
+}
+
+// Parses a pattern without alternates ('|')
+// (will further disambiguate any pattern).
+template <typename ManagedTokenSource>
+std::unique_ptr<AST::Pattern>
+Parser<ManagedTokenSource>::parse_pattern_no_alt ()
+{
const_TokenPtr t = lexer.peek_token ();
switch (t->get_id ())
{
diff --git a/gcc/rust/parse/rust-parse.h b/gcc/rust/parse/rust-parse.h
index a4b65c5..54a87c9 100644
--- a/gcc/rust/parse/rust-parse.h
+++ b/gcc/rust/parse/rust-parse.h
@@ -126,6 +126,7 @@ public:
std::unique_ptr<AST::Item> parse_item (bool called_from_statement);
std::unique_ptr<AST::Pattern> parse_pattern ();
+ std::unique_ptr<AST::Pattern> parse_pattern_no_alt ();
/**
* Parse a statement
diff --git a/gcc/testsuite/rust/compile/pattern-or.rs b/gcc/testsuite/rust/compile/pattern-or.rs
new file mode 100644
index 0000000..054b43f
--- /dev/null
+++ b/gcc/testsuite/rust/compile/pattern-or.rs
@@ -0,0 +1,7 @@
+// { dg-additional-options "-fsyntax-only" }
+
+fn main() {
+ match ((12, 13)) {
+ (_, 5) | (12, _) => {}
+ }
+}