From: Pierre-Emmanuel Patry Date: Tue, 10 Oct 2023 13:46:48 +0000 (+0200) Subject: gccrs: Allow macro named macro_rules X-Git-Tag: basepoints/gcc-15~2088 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=68a8a5503729c6b45b58e0147ebba675db6fbfd5;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h index 63dea9836df8..71f76f8e2eb6 100644 --- a/gcc/rust/parse/rust-parse-impl.h +++ b/gcc/rust/parse/rust-parse-impl.h @@ -1071,6 +1071,18 @@ Parser::parse_token_tree () } } +template +bool +Parser::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 std::unique_ptr @@ -1142,7 +1154,7 @@ Parser::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::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 904b5028a755..d5c1219b0800 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 parse_item (bool called_from_statement); std::unique_ptr parse_pattern (); std::unique_ptr parse_pattern_no_alt ();