Rollup merge of #80850 - m-ou-se:rustc-builtin-macro-name, r=petrochenkov
Allow #[rustc_builtin_macro = "name"] This adds the option of specifying the name of a builtin macro in the `#[rustc_builtin_macro]` attribute: `#[rustc_builtin_macro = "name"]`. This makes it possible to have both `std::panic!` and `core::panic!` as a builtin macro, by using different builtin macro names for each. This is needed to implement the edition-specific behaviour of the panic macros of RFC 3007. Also removes `SyntaxExtension::is_derive_copy`, as the macro name (e.g. `sym::Copy`) is now tracked and provides that information directly. r? ``@petrochenkov``
This commit is contained in:
commit
3e735c6e93
5 changed files with 13 additions and 15 deletions
|
@ -48,7 +48,7 @@ pub fn register_builtin_macros(resolver: &mut dyn ResolverExpand, edition: Editi
|
||||||
let mut register = |name, kind| {
|
let mut register = |name, kind| {
|
||||||
resolver.register_builtin_macro(
|
resolver.register_builtin_macro(
|
||||||
Ident::with_dummy_span(name),
|
Ident::with_dummy_span(name),
|
||||||
SyntaxExtension { is_builtin: true, ..SyntaxExtension::default(kind, edition) },
|
SyntaxExtension::default(kind, edition),
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
macro register_bang($($name:ident: $f:expr,)*) {
|
macro register_bang($($name:ident: $f:expr,)*) {
|
||||||
|
|
|
@ -728,9 +728,7 @@ pub struct SyntaxExtension {
|
||||||
pub edition: Edition,
|
pub edition: Edition,
|
||||||
/// Built-in macros have a couple of special properties like availability
|
/// Built-in macros have a couple of special properties like availability
|
||||||
/// in `#[no_implicit_prelude]` modules, so we have to keep this flag.
|
/// in `#[no_implicit_prelude]` modules, so we have to keep this flag.
|
||||||
pub is_builtin: bool,
|
pub builtin_name: Option<Symbol>,
|
||||||
/// We have to identify macros providing a `Copy` impl early for compatibility reasons.
|
|
||||||
pub is_derive_copy: bool,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SyntaxExtension {
|
impl SyntaxExtension {
|
||||||
|
@ -758,8 +756,7 @@ impl SyntaxExtension {
|
||||||
deprecation: None,
|
deprecation: None,
|
||||||
helper_attrs: Vec::new(),
|
helper_attrs: Vec::new(),
|
||||||
edition,
|
edition,
|
||||||
is_builtin: false,
|
builtin_name: None,
|
||||||
is_derive_copy: false,
|
|
||||||
kind,
|
kind,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -785,7 +782,9 @@ impl SyntaxExtension {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let is_builtin = sess.contains_name(attrs, sym::rustc_builtin_macro);
|
let builtin_name = sess
|
||||||
|
.find_by_name(attrs, sym::rustc_builtin_macro)
|
||||||
|
.map(|a| a.value_str().unwrap_or(name));
|
||||||
let (stability, const_stability) = attr::find_stability(&sess, attrs, span);
|
let (stability, const_stability) = attr::find_stability(&sess, attrs, span);
|
||||||
if const_stability.is_some() {
|
if const_stability.is_some() {
|
||||||
sess.parse_sess
|
sess.parse_sess
|
||||||
|
@ -803,8 +802,7 @@ impl SyntaxExtension {
|
||||||
deprecation: attr::find_deprecation(&sess, attrs).map(|(d, _)| d),
|
deprecation: attr::find_deprecation(&sess, attrs).map(|(d, _)| d),
|
||||||
helper_attrs,
|
helper_attrs,
|
||||||
edition,
|
edition,
|
||||||
is_builtin,
|
builtin_name,
|
||||||
is_derive_copy: is_builtin && name == sym::Copy,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -442,7 +442,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
|
||||||
// Internal attributes, Macro related:
|
// Internal attributes, Macro related:
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
|
|
||||||
rustc_attr!(rustc_builtin_macro, AssumedUsed, template!(Word), IMPL_DETAIL),
|
rustc_attr!(rustc_builtin_macro, AssumedUsed, template!(Word, NameValueStr: "name"), IMPL_DETAIL),
|
||||||
rustc_attr!(rustc_proc_macro_decls, Normal, template!(Word), INTERNAL_UNSTABLE),
|
rustc_attr!(rustc_proc_macro_decls, Normal, template!(Word), INTERNAL_UNSTABLE),
|
||||||
rustc_attr!(
|
rustc_attr!(
|
||||||
rustc_macro_transparency, AssumedUsed,
|
rustc_macro_transparency, AssumedUsed,
|
||||||
|
|
|
@ -1447,7 +1447,7 @@ impl<'a> Resolver<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_builtin_macro(&mut self, res: Res) -> bool {
|
fn is_builtin_macro(&mut self, res: Res) -> bool {
|
||||||
self.get_macro(res).map_or(false, |ext| ext.is_builtin)
|
self.get_macro(res).map_or(false, |ext| ext.builtin_name.is_some())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn macro_def(&self, mut ctxt: SyntaxContext) -> DefId {
|
fn macro_def(&self, mut ctxt: SyntaxContext) -> DefId {
|
||||||
|
@ -2014,7 +2014,7 @@ impl<'a> Resolver<'a> {
|
||||||
// The macro is a proc macro derive
|
// The macro is a proc macro derive
|
||||||
if let Some(def_id) = module.expansion.expn_data().macro_def_id {
|
if let Some(def_id) = module.expansion.expn_data().macro_def_id {
|
||||||
let ext = self.get_macro_by_def_id(def_id);
|
let ext = self.get_macro_by_def_id(def_id);
|
||||||
if !ext.is_builtin
|
if ext.builtin_name.is_none()
|
||||||
&& ext.macro_kind() == MacroKind::Derive
|
&& ext.macro_kind() == MacroKind::Derive
|
||||||
&& parent.expansion.outer_expn_is_descendant_of(span.ctxt())
|
&& parent.expansion.outer_expn_is_descendant_of(span.ctxt())
|
||||||
{
|
{
|
||||||
|
|
|
@ -285,7 +285,7 @@ impl<'a> ResolverExpand for Resolver<'a> {
|
||||||
helper_attrs.extend(
|
helper_attrs.extend(
|
||||||
ext.helper_attrs.iter().map(|name| Ident::new(*name, span)),
|
ext.helper_attrs.iter().map(|name| Ident::new(*name, span)),
|
||||||
);
|
);
|
||||||
if ext.is_derive_copy {
|
if ext.builtin_name == Some(sym::Copy) {
|
||||||
self.containers_deriving_copy.insert(invoc_id);
|
self.containers_deriving_copy.insert(invoc_id);
|
||||||
}
|
}
|
||||||
ext
|
ext
|
||||||
|
@ -1089,9 +1089,9 @@ impl<'a> Resolver<'a> {
|
||||||
edition,
|
edition,
|
||||||
);
|
);
|
||||||
|
|
||||||
if result.is_builtin {
|
if let Some(builtin_name) = result.builtin_name {
|
||||||
// The macro was marked with `#[rustc_builtin_macro]`.
|
// The macro was marked with `#[rustc_builtin_macro]`.
|
||||||
if let Some(builtin_macro) = self.builtin_macros.get_mut(&item.ident.name) {
|
if let Some(builtin_macro) = self.builtin_macros.get_mut(&builtin_name) {
|
||||||
// The macro is a built-in, replace its expander function
|
// The macro is a built-in, replace its expander function
|
||||||
// while still taking everything else from the source code.
|
// while still taking everything else from the source code.
|
||||||
// If we already loaded this builtin macro, give a better error message than 'no such builtin macro'.
|
// If we already loaded this builtin macro, give a better error message than 'no such builtin macro'.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue