From de153d61f5a4ef8681fc64fc55de2bcfe449c8c4 Mon Sep 17 00:00:00 2001 From: Vadim Petrochenkov Date: Tue, 11 Sep 2018 00:30:21 +0300 Subject: resolve: Reserve a few very special names in macro namespace --- src/librustc_resolve/macros.rs | 3 +++ src/librustc_resolve/resolve_imports.rs | 11 +++++++++++ 2 files changed, 14 insertions(+) (limited to 'src/librustc_resolve') diff --git a/src/librustc_resolve/macros.rs b/src/librustc_resolve/macros.rs index 351963bff5b..7733ce475e3 100644 --- a/src/librustc_resolve/macros.rs +++ b/src/librustc_resolve/macros.rs @@ -1083,6 +1083,9 @@ impl<'a, 'cl> Resolver<'a, 'cl> { 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 { diff --git a/src/librustc_resolve/resolve_imports.rs b/src/librustc_resolve/resolve_imports.rs index 68709f6891a..dfbea0ffe22 100644 --- a/src/librustc_resolve/resolve_imports.rs +++ b/src/librustc_resolve/resolve_imports.rs @@ -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. pub fn try_define(&mut self, module: Module<'a>, @@ -459,6 +469,7 @@ impl<'a, 'crateloader> Resolver<'a, 'crateloader> { 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() { -- cgit 1.4.1-3-g733a5