From d129c4ed8045f2e5f53b5cdddfd4caec1aa9d8e9 Mon Sep 17 00:00:00 2001 From: Arthur Cohen Date: Fri, 14 Jun 2024 16:45:34 +0200 Subject: gccrs: expand: Keep track of semicoloned builtin macros This is quite a rough fix (like a lot of the macro expansion code...) but it allows built-in macros to be treated as statements. I *think* asm!() might be the only one where it really matters, but also doing something like { line!(); } will now work, whereas before the macro invocation would not get expanded properly and would be ignored. gcc/rust/ChangeLog: * ast/rust-ast-fragment.h: Pass `is_semicolon` information to builtin macro transcribers. * ast/rust-macro.h: Pass semicolon information to transcriber.. * expand/rust-macro-builtins-asm.cc (MacroBuiltin::asm_handler): Likewise. (parse_asm): Likewise. * expand/rust-macro-builtins-asm.h (parse_asm): Likewise. * expand/rust-macro-builtins-format-args.cc (MacroBuiltin::format_args_handler): Likewise. * expand/rust-macro-builtins-include.cc (MacroBuiltin::include_bytes_handler): Likewise. (MacroBuiltin::include_str_handler): Likewise. (MacroBuiltin::include_handler): Likewise. * expand/rust-macro-builtins-location.cc (MacroBuiltin::file_handler): Likewise. (MacroBuiltin::column_handler): Likewise. (MacroBuiltin::line_handler): Likewise. * expand/rust-macro-builtins-log-debug.cc (MacroBuiltin::assert_handler): Likewise. * expand/rust-macro-builtins-utility.cc (MacroBuiltin::compile_error_handler): Likewise. (MacroBuiltin::concat_handler): Likewise. (MacroBuiltin::env_handler): Likewise. (MacroBuiltin::cfg_handler): Likewise. (MacroBuiltin::stringify_handler): Likewise. * expand/rust-macro-builtins.cc (format_args_maker): Likewise. (inline_asm_maker): Likewise. (MacroBuiltin::sorry): Likewise. (MacroBuiltin::proc_macro_builtin): Likewise. * expand/rust-macro-builtins.h: Likewise. * expand/rust-macro-expand.cc (MacroExpander::expand_decl_macro): Likewise. (MacroExpander::expand_invoc): Likewise. * ast/rust-ast-visitor.cc (DefaultASTVisitor::visit): Remove rust_unreachable. * ast/rust-ast.cc (InlineAsm::accept_vis): Likewise. * hir/tree/rust-hir.cc (InlineAsm::accept_vis): Likewise. --- gcc/rust/expand/rust-macro-builtins.h | 53 ++++++++++++++++++++++------------- 1 file changed, 33 insertions(+), 20 deletions(-) (limited to 'gcc/rust/expand/rust-macro-builtins.h') diff --git a/gcc/rust/expand/rust-macro-builtins.h b/gcc/rust/expand/rust-macro-builtins.h index 6db0b7a..7ed7515 100644 --- a/gcc/rust/expand/rust-macro-builtins.h +++ b/gcc/rust/expand/rust-macro-builtins.h @@ -123,57 +123,70 @@ public: static std::unordered_map builtin_transcribers; - static tl::optional - assert_handler (location_t invoc_locus, AST::MacroInvocData &invoc); + static tl::optional assert_handler (location_t invoc_locus, + AST::MacroInvocData &invoc, + bool semicolon); static tl::optional file_handler (location_t invoc_locus, - AST::MacroInvocData &invoc); + AST::MacroInvocData &invoc, + bool semicolon); - static tl::optional - column_handler (location_t invoc_locus, AST::MacroInvocData &invoc); + static tl::optional column_handler (location_t invoc_locus, + AST::MacroInvocData &invoc, + bool semicolon); static tl::optional - include_bytes_handler (location_t invoc_locus, AST::MacroInvocData &invoc); + include_bytes_handler (location_t invoc_locus, AST::MacroInvocData &invoc, + bool semicolon); static tl::optional - include_str_handler (location_t invoc_locus, AST::MacroInvocData &invoc); + include_str_handler (location_t invoc_locus, AST::MacroInvocData &invoc, + bool semicolon); static tl::optional - stringify_handler (location_t invoc_locus, AST::MacroInvocData &invoc); + stringify_handler (location_t invoc_locus, AST::MacroInvocData &invoc, + bool semicolon); static tl::optional - compile_error_handler (location_t invoc_locus, AST::MacroInvocData &invoc); + compile_error_handler (location_t invoc_locus, AST::MacroInvocData &invoc, + bool semicolon); - static tl::optional - concat_handler (location_t invoc_locus, AST::MacroInvocData &invoc); + static tl::optional concat_handler (location_t invoc_locus, + AST::MacroInvocData &invoc, + bool semicolon); static tl::optional env_handler (location_t invoc_locus, - AST::MacroInvocData &invoc); + AST::MacroInvocData &invoc, + bool semicolon); static tl::optional cfg_handler (location_t invoc_locus, - AST::MacroInvocData &invoc); + AST::MacroInvocData &invoc, + bool semicolon); static tl::optional - include_handler (location_t invoc_locus, AST::MacroInvocData &invoc); + include_handler (location_t invoc_locus, AST::MacroInvocData &invoc, + bool semicolon); static tl::optional line_handler (location_t invoc_locus, - AST::MacroInvocData &invoc); + AST::MacroInvocData &invoc, + bool semicolon); static tl::optional asm_handler (location_t invoc_locus, AST::MacroInvocData &invoc, + bool semicolon, bool is_global_asm); static tl::optional format_args_handler (location_t invoc_locus, AST::MacroInvocData &invoc, - AST::FormatArgs::Newline nl); + bool semicolon, AST::FormatArgs::Newline nl); - static tl::optional sorry (location_t invoc_locus, - AST::MacroInvocData &invoc); + static tl::optional + sorry (location_t invoc_locus, AST::MacroInvocData &invoc, bool semicolon); /* Builtin procedural macros do not work directly on tokens, but still need a * builtin transcriber to be considered proper builtin macros */ - static tl::optional proc_macro_builtin (location_t, - AST::MacroInvocData &); + static tl::optional + proc_macro_builtin (location_t, AST::MacroInvocData &, bool); }; } // namespace Rust -- cgit v1.1