diff options
author | Owen Avery <powerboat9.gamer@gmail.com> | 2023-02-14 18:42:39 -0500 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2024-01-16 16:23:02 +0100 |
commit | 4bd09ce06f50d266c992c984cc993384d5e6655e (patch) | |
tree | d3ddea29da0deaaecf7cf09e93b7a75d0af12aba | |
parent | 7a6906c8d80e437a97c780370a8fec4e00561c7b (diff) | |
download | gcc-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.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 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, _) => {} + } +} |