From df1a20119080c3b09fcf75d6374b69126db3f623 Mon Sep 17 00:00:00 2001 From: liushuyu Date: Tue, 2 Aug 2022 17:06:40 -0600 Subject: hir: more conformant builtin macro detection ... ... a macro is now considered builtin macro only if it has rustc_builtin_macro attribute. This also allows overriding macro definition with the same name as the builtin ones. Signed-off-by: Zixing Liu --- gcc/rust/util/rust-hir-map.cc | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) (limited to 'gcc') diff --git a/gcc/rust/util/rust-hir-map.cc b/gcc/rust/util/rust-hir-map.cc index 6a6deeb..8705fdc 100644 --- a/gcc/rust/util/rust-hir-map.cc +++ b/gcc/rust/util/rust-hir-map.cc @@ -18,6 +18,7 @@ #include "rust-hir-map.h" #include "rust-ast-full.h" +#include "rust-diagnostics.h" #include "rust-hir-full.h" #include "rust-macro-builtins.h" #include "rust-mapping-common.h" @@ -818,9 +819,22 @@ Mappings::insert_macro_def (AST::MacroRulesDefinition *macro) {"include", MacroBuiltin::include}, }; - auto builtin = builtin_macros.find (macro->get_rule_name ()); - if (builtin != builtin_macros.end ()) - macro->set_builtin_transcriber (builtin->second); + auto outer_attrs = macro->get_outer_attrs (); + bool should_be_builtin + = std::any_of (outer_attrs.begin (), outer_attrs.end (), + [] (AST::Attribute attr) { + return attr.get_path () == "rustc_builtin_macro"; + }); + if (should_be_builtin) + { + auto builtin = builtin_macros.find (macro->get_rule_name ()); + if (builtin != builtin_macros.end ()) + macro->set_builtin_transcriber (builtin->second); + else + rust_error_at (macro->get_locus (), + "cannot find a built-in macro with name %qs", + macro->get_rule_name ().c_str ()); + } auto it = macroMappings.find (macro->get_node_id ()); rust_assert (it == macroMappings.end ()); -- cgit v1.1