diff options
author | Owen Avery <powerboat9.gamer@gmail.com> | 2023-02-14 18:42:39 -0500 |
---|---|---|
committer | CohenArthur <arthur.cohen@embecosm.com> | 2023-02-20 10:32:44 +0000 |
commit | 15ca76ea868ccb9dbb0bd1a77f9b13746220499f (patch) | |
tree | e31787ad4c4e6be614c02e1b766ea8fcadc9bfa1 /gcc | |
parent | e23e7f14a51d93d87516c92efedc67f742a1213f (diff) | |
download | gcc-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.h | 33 | ||||
-rw-r--r-- | gcc/rust/parse/rust-parse.h | 1 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/pattern-or.rs | 7 |
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, _) => {} + } +} |