diff options
author | Arthur Cohen <arthur.cohen@embecosm.com> | 2024-06-14 16:45:34 +0200 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2025-03-17 16:35:49 +0100 |
commit | d129c4ed8045f2e5f53b5cdddfd4caec1aa9d8e9 (patch) | |
tree | c0949facaba007fc8b71d95547dacc1cffa41bc8 /gcc/rust/expand/rust-macro-builtins.h | |
parent | a3e002aa61e5d2effe7de143604431299114a0ae (diff) | |
download | gcc-d129c4ed8045f2e5f53b5cdddfd4caec1aa9d8e9.zip gcc-d129c4ed8045f2e5f53b5cdddfd4caec1aa9d8e9.tar.gz gcc-d129c4ed8045f2e5f53b5cdddfd4caec1aa9d8e9.tar.bz2 |
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.
Diffstat (limited to 'gcc/rust/expand/rust-macro-builtins.h')
-rw-r--r-- | gcc/rust/expand/rust-macro-builtins.h | 53 |
1 files changed, 33 insertions, 20 deletions
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<std::string, AST::MacroTranscriberFunc> builtin_transcribers; - static tl::optional<AST::Fragment> - assert_handler (location_t invoc_locus, AST::MacroInvocData &invoc); + static tl::optional<AST::Fragment> assert_handler (location_t invoc_locus, + AST::MacroInvocData &invoc, + bool semicolon); static tl::optional<AST::Fragment> file_handler (location_t invoc_locus, - AST::MacroInvocData &invoc); + AST::MacroInvocData &invoc, + bool semicolon); - static tl::optional<AST::Fragment> - column_handler (location_t invoc_locus, AST::MacroInvocData &invoc); + static tl::optional<AST::Fragment> column_handler (location_t invoc_locus, + AST::MacroInvocData &invoc, + bool semicolon); static tl::optional<AST::Fragment> - 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<AST::Fragment> - 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<AST::Fragment> - stringify_handler (location_t invoc_locus, AST::MacroInvocData &invoc); + stringify_handler (location_t invoc_locus, AST::MacroInvocData &invoc, + bool semicolon); static tl::optional<AST::Fragment> - 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<AST::Fragment> - concat_handler (location_t invoc_locus, AST::MacroInvocData &invoc); + static tl::optional<AST::Fragment> concat_handler (location_t invoc_locus, + AST::MacroInvocData &invoc, + bool semicolon); static tl::optional<AST::Fragment> env_handler (location_t invoc_locus, - AST::MacroInvocData &invoc); + AST::MacroInvocData &invoc, + bool semicolon); static tl::optional<AST::Fragment> cfg_handler (location_t invoc_locus, - AST::MacroInvocData &invoc); + AST::MacroInvocData &invoc, + bool semicolon); static tl::optional<AST::Fragment> - include_handler (location_t invoc_locus, AST::MacroInvocData &invoc); + include_handler (location_t invoc_locus, AST::MacroInvocData &invoc, + bool semicolon); static tl::optional<AST::Fragment> line_handler (location_t invoc_locus, - AST::MacroInvocData &invoc); + AST::MacroInvocData &invoc, + bool semicolon); static tl::optional<AST::Fragment> asm_handler (location_t invoc_locus, AST::MacroInvocData &invoc, + bool semicolon, bool is_global_asm); static tl::optional<AST::Fragment> format_args_handler (location_t invoc_locus, AST::MacroInvocData &invoc, - AST::FormatArgs::Newline nl); + bool semicolon, AST::FormatArgs::Newline nl); - static tl::optional<AST::Fragment> sorry (location_t invoc_locus, - AST::MacroInvocData &invoc); + static tl::optional<AST::Fragment> + 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<AST::Fragment> proc_macro_builtin (location_t, - AST::MacroInvocData &); + static tl::optional<AST::Fragment> + proc_macro_builtin (location_t, AST::MacroInvocData &, bool); }; } // namespace Rust |