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>
This commit is contained in:
liushuyu 2022-08-02 17:06:40 -06:00
parent c788a80619
commit df1a201190
1 changed files with 17 additions and 3 deletions

View File

@ -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 ());