diff options
author | liushuyu <liushuyu011@gmail.com> | 2022-08-02 17:06:40 -0600 |
---|---|---|
committer | liushuyu <liushuyu011@gmail.com> | 2022-08-03 20:22:11 -0600 |
commit | df1a20119080c3b09fcf75d6374b69126db3f623 (patch) | |
tree | 00e97bcca422910d1b62bf5bdda7b8297619fe57 | |
parent | c788a806195f326a595cd15b96c59e7584927f1a (diff) | |
download | gcc-df1a20119080c3b09fcf75d6374b69126db3f623.zip gcc-df1a20119080c3b09fcf75d6374b69126db3f623.tar.gz gcc-df1a20119080c3b09fcf75d6374b69126db3f623.tar.bz2 |
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 <liushuyu011@gmail.com>
-rw-r--r-- | gcc/rust/util/rust-hir-map.cc | 20 |
1 files changed, 17 insertions, 3 deletions
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 ()); |