diff options
author | Arthur Cohen <arthur.cohen@embecosm.com> | 2024-06-14 16:45:34 +0200 |
---|---|---|
committer | CohenArthur <arthur.cohen@embecosm.com> | 2024-06-18 12:24:32 +0000 |
commit | fb906a41a4e911f7f0d7b506347286c7d942995e (patch) | |
tree | aab1c7992a4e3845b774a246ae070e8824bf82a6 /gcc/rust/expand/rust-macro-builtins.cc | |
parent | 89c056bf3738ecbe41ef9545697937c3f4fbbd87 (diff) | |
download | gcc-fb906a41a4e911f7f0d7b506347286c7d942995e.zip gcc-fb906a41a4e911f7f0d7b506347286c7d942995e.tar.gz gcc-fb906a41a4e911f7f0d7b506347286c7d942995e.tar.bz2 |
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.cc')
-rw-r--r-- | gcc/rust/expand/rust-macro-builtins.cc | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/gcc/rust/expand/rust-macro-builtins.cc b/gcc/rust/expand/rust-macro-builtins.cc index a6a3370..567f4db 100644 --- a/gcc/rust/expand/rust-macro-builtins.cc +++ b/gcc/rust/expand/rust-macro-builtins.cc @@ -87,8 +87,8 @@ const BiMap<std::string, BuiltinMacro> MacroBuiltin::builtins = {{ AST::MacroTranscriberFunc format_args_maker (AST::FormatArgs::Newline nl) { - return [nl] (location_t loc, AST::MacroInvocData &invoc) { - return MacroBuiltin::format_args_handler (loc, invoc, nl); + return [nl] (location_t loc, AST::MacroInvocData &invoc, bool semicolon) { + return MacroBuiltin::format_args_handler (loc, invoc, semicolon, nl); }; } @@ -103,9 +103,10 @@ inline_asm_maker (isGlobalAsm is_global_asm) { bool global_asm = is_global_asm == isGlobalAsm::Global ? true : false; - return [global_asm] (location_t loc, AST::MacroInvocData &invoc) { - return MacroBuiltin::asm_handler (loc, invoc, global_asm); - }; + return + [global_asm] (location_t loc, AST::MacroInvocData &invoc, bool semicolon) { + return MacroBuiltin::asm_handler (loc, invoc, semicolon, global_asm); + }; } std::unordered_map<std::string, AST::MacroTranscriberFunc> @@ -167,7 +168,8 @@ builtin_macro_from_string (const std::string &identifier) } tl::optional<AST::Fragment> -MacroBuiltin::sorry (location_t invoc_locus, AST::MacroInvocData &invoc) +MacroBuiltin::sorry (location_t invoc_locus, AST::MacroInvocData &invoc, + bool semicolon) { rust_sorry_at (invoc_locus, "unimplemented builtin macro: %qs", invoc.get_path ().as_string ().c_str ()); @@ -177,7 +179,7 @@ MacroBuiltin::sorry (location_t invoc_locus, AST::MacroInvocData &invoc) tl::optional<AST::Fragment> MacroBuiltin::proc_macro_builtin (location_t invoc_locus, - AST::MacroInvocData &invoc) + AST::MacroInvocData &invoc, bool semicolon) { rust_error_at (invoc_locus, "cannot invoke derive macro: %qs", invoc.get_path ().as_string ().c_str ()); |