diff options
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 c76a353..c29b9c6 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 06efa22..50277fc 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 af967b5..30f226e 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); |