diff options
| author | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2018-09-11 00:30:21 +0300 |
|---|---|---|
| committer | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2018-09-11 01:13:55 +0300 |
| commit | de153d61f5a4ef8681fc64fc55de2bcfe449c8c4 (patch) | |
| tree | 82780bd162d339bc56a11dee53e2a4e42f04458d /src/librustc_resolve | |
| parent | 65c8c97bc7151809db58756182c22032379585d9 (diff) | |
| download | rust-de153d61f5a4ef8681fc64fc55de2bcfe449c8c4.tar.gz rust-de153d61f5a4ef8681fc64fc55de2bcfe449c8c4.zip | |
resolve: Reserve a few very special names in macro namespace
Diffstat (limited to 'src/librustc_resolve')
| -rw-r--r-- | src/librustc_resolve/macros.rs | 3 | ||||
| -rw-r--r-- | src/librustc_resolve/resolve_imports.rs | 11 |
2 files changed, 14 insertions, 0 deletions
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() { |
