self.define(module, ident, MacroNS,
(def, vis, item.span, expansion, IsMacroExport));
} else {
+ if !attr::contains_name(&item.attrs, "rustc_doc_only_macro") {
+ self.check_reserved_macro_name(ident, MacroNS);
+ }
self.unused_macros.insert(def_id);
}
} else {
})
}
+ 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.
pub fn try_define(&mut self,
module: Module<'a>,
ns: Namespace,
binding: &'a NameBinding<'a>)
-> Result<(), &'a NameBinding<'a>> {
+ self.check_reserved_macro_name(ident, ns);
self.update_resolution(module, ident, ns, |this, resolution| {
if let Some(old_binding) = resolution.binding {
if binding.is_glob_import() {
#[cfg_attr(all(), repr(C))] //~ ERROR `repr` is ambiguous
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
fn test() {}
| ^^^^
= 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
- --> $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
| ^^^^ ambiguous name
LL | use builtin_attrs::*;
| ^^^^^^^^^^^^^^^^
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
| ^^^^
= note: consider adding an explicit import of `repr` to disambiguate
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
| ^^^^ ambiguous name
LL | use builtin_attrs::*;
| ^^^^^^^^^^^^^^^^
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
| ^^^^
= note: consider adding an explicit import of `feature` to disambiguate
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
| ^^^^^^^^^^^ not found in this scope
-error: aborting due to 7 previous errors
+error: aborting due to 6 previous errors
Some errors occurred: E0425, E0659.
For more information about an error, try `rustc --explain E0425`.
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]
pub fn test(_: TokenStream, input: TokenStream) -> TokenStream {
"struct Test;".parse().unwrap()
--- /dev/null
+#![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
+}
--- /dev/null
+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
+