aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorOwen Avery <powerboat9.gamer@gmail.com>2023-02-14 18:42:39 -0500
committerCohenArthur <arthur.cohen@embecosm.com>2023-02-20 10:32:44 +0000
commit15ca76ea868ccb9dbb0bd1a77f9b13746220499f (patch)
treee31787ad4c4e6be614c02e1b766ea8fcadc9bfa1 /gcc
parente23e7f14a51d93d87516c92efedc67f742a1213f (diff)
downloadgcc-15ca76ea868ccb9dbb0bd1a77f9b13746220499f.zip
gcc-15ca76ea868ccb9dbb0bd1a77f9b13746220499f.tar.gz
gcc-15ca76ea868ccb9dbb0bd1a77f9b13746220499f.tar.bz2
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>
Diffstat (limited to 'gcc')
-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 db32803d..4c39284 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, _) => {}
+ }
+}