diff options
author | Owen Avery <powerboat9.gamer@gmail.com> | 2023-05-30 16:24:08 -0400 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2024-01-16 18:37:23 +0100 |
commit | 007248a2c48ef3c349204899b325bab574019734 (patch) | |
tree | 647a3462ab5b2bfd1b21a37055f0104c75496b7f /gcc | |
parent | d3d751cbac030902014856bbbd310a90b02912af (diff) | |
download | gcc-007248a2c48ef3c349204899b325bab574019734.zip gcc-007248a2c48ef3c349204899b325bab574019734.tar.gz gcc-007248a2c48ef3c349204899b325bab574019734.tar.bz2 |
gccrs: Properly match delimiters
gcc/rust/ChangeLog:
* expand/rust-macro-expand.cc
(MacroExpander::try_match_rule): Don't match delimiters for root matcher.
(MacroExpander::match_matcher): Add option to match delimiters.
* expand/rust-macro-expand.h
(MacroExpander::match_matcher): Likewise.
* parse/rust-parse-impl.h
(Parser::skip_token): Add zero argument method.
* parse/rust-parse.h:
(Parser::skip_token): Likewise.
gcc/testsuite/ChangeLog:
* rust/compile/macro-delim.rs: New test.
Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/rust/expand/rust-macro-expand.cc | 18 | ||||
-rw-r--r-- | gcc/rust/expand/rust-macro-expand.h | 3 | ||||
-rw-r--r-- | gcc/rust/parse/rust-parse-impl.h | 8 | ||||
-rw-r--r-- | gcc/rust/parse/rust-parse.h | 5 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/macro-delim.rs | 8 |
5 files changed, 35 insertions, 7 deletions
diff --git a/gcc/rust/expand/rust-macro-expand.cc b/gcc/rust/expand/rust-macro-expand.cc index f347335..7229a09 100644 --- a/gcc/rust/expand/rust-macro-expand.cc +++ b/gcc/rust/expand/rust-macro-expand.cc @@ -352,7 +352,7 @@ MacroExpander::try_match_rule (AST::MacroRule &match_rule, AST::MacroMatcher &matcher = match_rule.get_matcher (); expansion_depth++; - if (!match_matcher (parser, matcher)) + if (!match_matcher (parser, matcher, false, false)) { expansion_depth--; return false; @@ -437,7 +437,8 @@ MacroExpander::match_fragment (Parser<MacroInvocLexer> &parser, bool MacroExpander::match_matcher (Parser<MacroInvocLexer> &parser, - AST::MacroMatcher &matcher, bool in_repetition) + AST::MacroMatcher &matcher, bool in_repetition, + bool match_delim) { if (depth_exceeds_recursion_limit ()) { @@ -447,29 +448,34 @@ MacroExpander::match_matcher (Parser<MacroInvocLexer> &parser, auto delimiter = parser.peek_current_token (); + auto check_delim = [&matcher, match_delim] (AST::DelimType delim) { + return !match_delim || matcher.get_delim_type () == delim; + }; + // this is used so we can check that we delimit the stream correctly. switch (delimiter->get_id ()) { case LEFT_PAREN: { - if (!parser.skip_token (LEFT_PAREN)) + if (!check_delim (AST::DelimType::PARENS)) return false; } break; case LEFT_SQUARE: { - if (!parser.skip_token (LEFT_SQUARE)) + if (!check_delim (AST::DelimType::SQUARE)) return false; } break; case LEFT_CURLY: { - if (!parser.skip_token (LEFT_CURLY)) + if (!check_delim (AST::DelimType::CURLY)) return false; } break; default: - gcc_unreachable (); + return false; } + parser.skip_token (); const MacroInvocLexer &source = parser.get_token_source (); diff --git a/gcc/rust/expand/rust-macro-expand.h b/gcc/rust/expand/rust-macro-expand.h index ceac8e6..a24ec4f 100644 --- a/gcc/rust/expand/rust-macro-expand.h +++ b/gcc/rust/expand/rust-macro-expand.h @@ -275,7 +275,8 @@ struct MacroExpander AST::MacroMatchRepetition &rep); bool match_matcher (Parser<MacroInvocLexer> &parser, - AST::MacroMatcher &matcher, bool in_repetition = false); + AST::MacroMatcher &matcher, bool in_repetition = false, + bool match_delim = true); /** * Match any amount of matches diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h index 3f25006..9faa374 100644 --- a/gcc/rust/parse/rust-parse-impl.h +++ b/gcc/rust/parse/rust-parse-impl.h @@ -12159,6 +12159,14 @@ Parser<ManagedTokenSource>::skip_after_semicolon () lexer.skip_token (); } +/* Skips the current token */ +template <typename ManagedTokenSource> +void +Parser<ManagedTokenSource>::skip_token () +{ + lexer.skip_token (); +} + /* Checks if current token has inputted id - skips it and returns true if so, * diagnoses an error and returns false otherwise. */ template <typename ManagedTokenSource> diff --git a/gcc/rust/parse/rust-parse.h b/gcc/rust/parse/rust-parse.h index 1e7e526..315d3fc 100644 --- a/gcc/rust/parse/rust-parse.h +++ b/gcc/rust/parse/rust-parse.h @@ -95,6 +95,11 @@ template <typename ManagedTokenSource> class Parser { public: /** + * Consume a token + */ + void skip_token (); + + /** * Consume a token, reporting an error if it isn't the next token * * @param t ID of the token to consume diff --git a/gcc/testsuite/rust/compile/macro-delim.rs b/gcc/testsuite/rust/compile/macro-delim.rs new file mode 100644 index 0000000..de4cd56 --- /dev/null +++ b/gcc/testsuite/rust/compile/macro-delim.rs @@ -0,0 +1,8 @@ +macro_rules! foo { + ([]) => {struct Foo;}; + (()) => {struct _A;}; + (bool) => {struct _B;}; +} + +foo! (()); +foo! (bool); |