diff options
author | Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com> | 2023-10-10 15:46:48 +0200 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2024-01-16 19:09:17 +0100 |
commit | 68a8a5503729c6b45b58e0147ebba675db6fbfd5 (patch) | |
tree | ab7ba8b59b6cd8f5e3ef5ab3d0dd492ea053e556 /gcc/rust | |
parent | 3d43c98bf857c42ec533cc605f157b8431aa1b4c (diff) | |
download | gcc-68a8a5503729c6b45b58e0147ebba675db6fbfd5.zip gcc-68a8a5503729c6b45b58e0147ebba675db6fbfd5.tar.gz gcc-68a8a5503729c6b45b58e0147ebba675db6fbfd5.tar.bz2 |
gccrs: Allow macro named macro_rules
Change the constraints around macro rules declaration in order to allow
macro_rules named macro as well as tighter constraint around macro rules
definitions.
gcc/rust/ChangeLog:
* parse/rust-parse-impl.h (Parser::is_macro_rules_def): Add a function
that checks tokens given by the lexer represents an accurate macro
definition. This will reduce code duplication.
(Parser::parse_item): Replace condition with call to new checking
function.
(Parser::parse_stmt): Likewise.
* parse/rust-parse.h: Add function prototype for is_macro_rules_def.
Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Diffstat (limited to 'gcc/rust')
-rw-r--r-- | gcc/rust/parse/rust-parse-impl.h | 17 | ||||
-rw-r--r-- | gcc/rust/parse/rust-parse.h | 1 |
2 files changed, 15 insertions, 3 deletions
diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h index 63dea98..71f76f8 100644 --- a/gcc/rust/parse/rust-parse-impl.h +++ b/gcc/rust/parse/rust-parse-impl.h @@ -1071,6 +1071,18 @@ Parser<ManagedTokenSource>::parse_token_tree () } } +template <typename ManagedTokenSource> +bool +Parser<ManagedTokenSource>::is_macro_rules_def (const_TokenPtr t) +{ + auto macro_name = lexer.peek_token (2)->get_id (); + + bool allowed_macro_name = (macro_name == IDENTIFIER || macro_name == TRY); + + return t->get_str () == "macro_rules" + && lexer.peek_token (1)->get_id () == EXCLAM && allowed_macro_name; +} + // Parses a single item template <typename ManagedTokenSource> std::unique_ptr<AST::Item> @@ -1142,7 +1154,7 @@ Parser<ManagedTokenSource>::parse_item (bool called_from_statement) "default", "impl")); return nullptr; } - else if (t->get_str () == "macro_rules") + else if (is_macro_rules_def (t)) { // macro_rules! macro item return parse_macro_rules_def (std::move (outer_attrs)); @@ -6233,8 +6245,7 @@ Parser<ManagedTokenSource>::parse_stmt (ParseRestrictions restrictions) return parse_vis_item (std::move (outer_attrs)); // or should this go straight to parsing union? } - else if (t->get_str () == "macro_rules" - && lexer.peek_token (1)->get_id () == EXCLAM) + else if (is_macro_rules_def (t)) { // macro_rules! macro item return parse_macro_rules_def (std::move (outer_attrs)); diff --git a/gcc/rust/parse/rust-parse.h b/gcc/rust/parse/rust-parse.h index 904b502..d5c1219 100644 --- a/gcc/rust/parse/rust-parse.h +++ b/gcc/rust/parse/rust-parse.h @@ -141,6 +141,7 @@ public: parse_block_expr (AST::AttrVec outer_attrs = AST::AttrVec (), location_t pratt_parsed_loc = UNKNOWN_LOCATION); + bool is_macro_rules_def (const_TokenPtr t); 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 (); |