resolve: Reserve a few very special names in macro namespace
This commit is contained in:
parent
65c8c97bc7
commit
de153d61f5
7 changed files with 62 additions and 52 deletions
|
@ -1083,6 +1083,9 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
|
||||||
self.define(module, ident, MacroNS,
|
self.define(module, ident, MacroNS,
|
||||||
(def, vis, item.span, expansion, IsMacroExport));
|
(def, vis, item.span, expansion, IsMacroExport));
|
||||||
} else {
|
} else {
|
||||||
|
if !attr::contains_name(&item.attrs, "rustc_doc_only_macro") {
|
||||||
|
self.check_reserved_macro_name(ident, MacroNS);
|
||||||
|
}
|
||||||
self.unused_macros.insert(def_id);
|
self.unused_macros.insert(def_id);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -452,6 +452,16 @@ impl<'a, 'crateloader> Resolver<'a, 'crateloader> {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
crate fn check_reserved_macro_name(&self, ident: Ident, ns: Namespace) {
|
||||||
|
// Reserve some names that are not quite covered by the general check
|
||||||
|
// performed on `Resolver::builtin_attrs`.
|
||||||
|
if ns == MacroNS &&
|
||||||
|
(ident.name == "cfg" || ident.name == "cfg_attr" || ident.name == "derive") {
|
||||||
|
self.session.span_err(ident.span,
|
||||||
|
&format!("name `{}` is reserved in macro namespace", ident));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Define the name or return the existing binding if there is a collision.
|
// Define the name or return the existing binding if there is a collision.
|
||||||
pub fn try_define(&mut self,
|
pub fn try_define(&mut self,
|
||||||
module: Module<'a>,
|
module: Module<'a>,
|
||||||
|
@ -459,6 +469,7 @@ impl<'a, 'crateloader> Resolver<'a, 'crateloader> {
|
||||||
ns: Namespace,
|
ns: Namespace,
|
||||||
binding: &'a NameBinding<'a>)
|
binding: &'a NameBinding<'a>)
|
||||||
-> Result<(), &'a NameBinding<'a>> {
|
-> Result<(), &'a NameBinding<'a>> {
|
||||||
|
self.check_reserved_macro_name(ident, ns);
|
||||||
self.update_resolution(module, ident, ns, |this, resolution| {
|
self.update_resolution(module, ident, ns, |this, resolution| {
|
||||||
if let Some(old_binding) = resolution.binding {
|
if let Some(old_binding) = resolution.binding {
|
||||||
if binding.is_glob_import() {
|
if binding.is_glob_import() {
|
||||||
|
|
|
@ -11,19 +11,6 @@ struct S;
|
||||||
#[cfg_attr(all(), repr(C))] //~ ERROR `repr` is ambiguous
|
#[cfg_attr(all(), repr(C))] //~ ERROR `repr` is ambiguous
|
||||||
struct SCond;
|
struct SCond;
|
||||||
|
|
||||||
#[cfg(all())] //~ ERROR `cfg` is ambiguous
|
|
||||||
struct A;
|
|
||||||
#[cfg(any())] // ERROR FIXME
|
|
||||||
struct A;
|
|
||||||
|
|
||||||
#[cfg_attr(all(), cold)] // ERROR FIXME
|
|
||||||
fn g() {}
|
|
||||||
#[cfg_attr(any(), cold)] // ERROR FIXME
|
|
||||||
fn h() {}
|
|
||||||
|
|
||||||
#[derive(Clone)] // ERROR FIXME
|
|
||||||
struct B;
|
|
||||||
|
|
||||||
#[test] // OK, shadowed
|
#[test] // OK, shadowed
|
||||||
fn test() {}
|
fn test() {}
|
||||||
|
|
||||||
|
|
|
@ -34,26 +34,8 @@ LL | #[cfg_attr(all(), repr(C))] //~ ERROR `repr` is ambiguous
|
||||||
| ^^^^
|
| ^^^^
|
||||||
= note: consider adding an explicit import of `repr` to disambiguate
|
= note: consider adding an explicit import of `repr` to disambiguate
|
||||||
|
|
||||||
error[E0659]: `cfg` is ambiguous
|
|
||||||
--> $DIR/ambiguous-builtin-attrs.rs:14:3
|
|
||||||
|
|
|
||||||
LL | #[cfg(all())] //~ ERROR `cfg` is ambiguous
|
|
||||||
| ^^^ ambiguous name
|
|
||||||
|
|
|
||||||
note: `cfg` could refer to the name imported here
|
|
||||||
--> $DIR/ambiguous-builtin-attrs.rs:7:5
|
|
||||||
|
|
|
||||||
LL | use builtin_attrs::*;
|
|
||||||
| ^^^^^^^^^^^^^^^^
|
|
||||||
note: `cfg` could also refer to the name defined here
|
|
||||||
--> $DIR/ambiguous-builtin-attrs.rs:14:3
|
|
||||||
|
|
|
||||||
LL | #[cfg(all())] //~ ERROR `cfg` is ambiguous
|
|
||||||
| ^^^
|
|
||||||
= note: consider adding an explicit import of `cfg` to disambiguate
|
|
||||||
|
|
||||||
error[E0659]: `repr` is ambiguous
|
error[E0659]: `repr` is ambiguous
|
||||||
--> $DIR/ambiguous-builtin-attrs.rs:33:34
|
--> $DIR/ambiguous-builtin-attrs.rs:20:34
|
||||||
|
|
|
|
||||||
LL | fn non_macro_expanded_location<#[repr(C)] T>() { //~ ERROR `repr` is ambiguous
|
LL | fn non_macro_expanded_location<#[repr(C)] T>() { //~ ERROR `repr` is ambiguous
|
||||||
| ^^^^ ambiguous name
|
| ^^^^ ambiguous name
|
||||||
|
@ -64,14 +46,14 @@ note: `repr` could refer to the name imported here
|
||||||
LL | use builtin_attrs::*;
|
LL | use builtin_attrs::*;
|
||||||
| ^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^
|
||||||
note: `repr` could also refer to the name defined here
|
note: `repr` could also refer to the name defined here
|
||||||
--> $DIR/ambiguous-builtin-attrs.rs:33:34
|
--> $DIR/ambiguous-builtin-attrs.rs:20:34
|
||||||
|
|
|
|
||||||
LL | fn non_macro_expanded_location<#[repr(C)] T>() { //~ ERROR `repr` is ambiguous
|
LL | fn non_macro_expanded_location<#[repr(C)] T>() { //~ ERROR `repr` is ambiguous
|
||||||
| ^^^^
|
| ^^^^
|
||||||
= note: consider adding an explicit import of `repr` to disambiguate
|
= note: consider adding an explicit import of `repr` to disambiguate
|
||||||
|
|
||||||
error[E0659]: `repr` is ambiguous
|
error[E0659]: `repr` is ambiguous
|
||||||
--> $DIR/ambiguous-builtin-attrs.rs:35:11
|
--> $DIR/ambiguous-builtin-attrs.rs:22:11
|
||||||
|
|
|
|
||||||
LL | #[repr(C)] //~ ERROR `repr` is ambiguous
|
LL | #[repr(C)] //~ ERROR `repr` is ambiguous
|
||||||
| ^^^^ ambiguous name
|
| ^^^^ ambiguous name
|
||||||
|
@ -82,7 +64,7 @@ note: `repr` could refer to the name imported here
|
||||||
LL | use builtin_attrs::*;
|
LL | use builtin_attrs::*;
|
||||||
| ^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^
|
||||||
note: `repr` could also refer to the name defined here
|
note: `repr` could also refer to the name defined here
|
||||||
--> $DIR/ambiguous-builtin-attrs.rs:35:11
|
--> $DIR/ambiguous-builtin-attrs.rs:22:11
|
||||||
|
|
|
|
||||||
LL | #[repr(C)] //~ ERROR `repr` is ambiguous
|
LL | #[repr(C)] //~ ERROR `repr` is ambiguous
|
||||||
| ^^^^
|
| ^^^^
|
||||||
|
@ -107,12 +89,12 @@ LL | #![feature(decl_macro)] //~ ERROR `feature` is ambiguous
|
||||||
= note: consider adding an explicit import of `feature` to disambiguate
|
= note: consider adding an explicit import of `feature` to disambiguate
|
||||||
|
|
||||||
error[E0425]: cannot find value `NonExistent` in this scope
|
error[E0425]: cannot find value `NonExistent` in this scope
|
||||||
--> $DIR/ambiguous-builtin-attrs.rs:43:5
|
--> $DIR/ambiguous-builtin-attrs.rs:30:5
|
||||||
|
|
|
|
||||||
LL | NonExistent; //~ ERROR cannot find value `NonExistent` in this scope
|
LL | NonExistent; //~ ERROR cannot find value `NonExistent` in this scope
|
||||||
| ^^^^^^^^^^^ not found in this scope
|
| ^^^^^^^^^^^ not found in this scope
|
||||||
|
|
||||||
error: aborting due to 7 previous errors
|
error: aborting due to 6 previous errors
|
||||||
|
|
||||||
Some errors occurred: E0425, E0659.
|
Some errors occurred: E0425, E0659.
|
||||||
For more information about an error, try `rustc --explain E0425`.
|
For more information about an error, try `rustc --explain E0425`.
|
||||||
|
|
|
@ -25,21 +25,6 @@ pub fn repr(_: TokenStream, input: TokenStream) -> TokenStream {
|
||||||
input
|
input
|
||||||
}
|
}
|
||||||
|
|
||||||
#[proc_macro_attribute]
|
|
||||||
pub fn cfg(_: TokenStream, input: TokenStream) -> TokenStream {
|
|
||||||
input
|
|
||||||
}
|
|
||||||
|
|
||||||
#[proc_macro_attribute]
|
|
||||||
pub fn cfg_attr(_: TokenStream, input: TokenStream) -> TokenStream {
|
|
||||||
input
|
|
||||||
}
|
|
||||||
|
|
||||||
#[proc_macro_attribute]
|
|
||||||
pub fn derive(_: TokenStream, input: TokenStream) -> TokenStream {
|
|
||||||
input
|
|
||||||
}
|
|
||||||
|
|
||||||
#[proc_macro_attribute]
|
#[proc_macro_attribute]
|
||||||
pub fn test(_: TokenStream, input: TokenStream) -> TokenStream {
|
pub fn test(_: TokenStream, input: TokenStream) -> TokenStream {
|
||||||
"struct Test;".parse().unwrap()
|
"struct Test;".parse().unwrap()
|
||||||
|
|
22
src/test/ui-fulldeps/proc-macro/reserved-macro-names.rs
Normal file
22
src/test/ui-fulldeps/proc-macro/reserved-macro-names.rs
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
#![crate_type = "proc-macro"]
|
||||||
|
|
||||||
|
extern crate proc_macro;
|
||||||
|
use proc_macro::*;
|
||||||
|
|
||||||
|
#[proc_macro_attribute]
|
||||||
|
pub fn cfg(_: TokenStream, input: TokenStream) -> TokenStream {
|
||||||
|
//~^ ERROR name `cfg` is reserved in macro namespace
|
||||||
|
input
|
||||||
|
}
|
||||||
|
|
||||||
|
#[proc_macro_attribute]
|
||||||
|
pub fn cfg_attr(_: TokenStream, input: TokenStream) -> TokenStream {
|
||||||
|
//~^ ERROR name `cfg_attr` is reserved in macro namespace
|
||||||
|
input
|
||||||
|
}
|
||||||
|
|
||||||
|
#[proc_macro_attribute]
|
||||||
|
pub fn derive(_: TokenStream, input: TokenStream) -> TokenStream {
|
||||||
|
//~^ ERROR name `derive` is reserved in macro namespace
|
||||||
|
input
|
||||||
|
}
|
20
src/test/ui-fulldeps/proc-macro/reserved-macro-names.stderr
Normal file
20
src/test/ui-fulldeps/proc-macro/reserved-macro-names.stderr
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
error: name `cfg` is reserved in macro namespace
|
||||||
|
--> $DIR/reserved-macro-names.rs:7:8
|
||||||
|
|
|
||||||
|
LL | pub fn cfg(_: TokenStream, input: TokenStream) -> TokenStream {
|
||||||
|
| ^^^
|
||||||
|
|
||||||
|
error: name `cfg_attr` is reserved in macro namespace
|
||||||
|
--> $DIR/reserved-macro-names.rs:13:8
|
||||||
|
|
|
||||||
|
LL | pub fn cfg_attr(_: TokenStream, input: TokenStream) -> TokenStream {
|
||||||
|
| ^^^^^^^^
|
||||||
|
|
||||||
|
error: name `derive` is reserved in macro namespace
|
||||||
|
--> $DIR/reserved-macro-names.rs:19:8
|
||||||
|
|
|
||||||
|
LL | pub fn derive(_: TokenStream, input: TokenStream) -> TokenStream {
|
||||||
|
| ^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to 3 previous errors
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue