From: Vadim Petrochenkov Date: Fri, 17 Aug 2018 23:04:50 +0000 (+0300) Subject: resolve: Do not error on access to proc macros imported with `#[macro_use]` X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=e411bb33f828fd8e63ca5e9e6f011e50828e23bd;p=rust.git resolve: Do not error on access to proc macros imported with `#[macro_use]` --- diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index 10dddfed6a5..3f9c1520957 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -1429,8 +1429,6 @@ pub struct Resolver<'a, 'b: 'a> { ambiguity_errors: Vec>, /// `use` injections are delayed for better placement and deduplication use_injections: Vec>, - /// `use` injections for proc macros wrongly imported with #[macro_use] - proc_mac_errors: Vec, /// crate-local macro expanded `macro_export` referred to by a module-relative path macro_expanded_macro_export_errors: BTreeSet<(Span, Span)>, @@ -1458,9 +1456,6 @@ pub struct Resolver<'a, 'b: 'a> { /// Avoid duplicated errors for "name already defined". name_already_seen: FxHashMap, - /// A set of procedural macros imported by `#[macro_use]` that have already been warned about - warned_proc_macros: FxHashSet, - potentially_unused_imports: Vec<&'a ImportDirective<'a>>, /// This table maps struct IDs into struct constructor IDs, @@ -1744,7 +1739,6 @@ pub fn new(session: &'a Session, privacy_errors: Vec::new(), ambiguity_errors: Vec::new(), use_injections: Vec::new(), - proc_mac_errors: Vec::new(), macro_expanded_macro_export_errors: BTreeSet::new(), arenas, @@ -1766,7 +1760,6 @@ pub fn new(session: &'a Session, local_macro_def_scopes: FxHashMap(), name_already_seen: FxHashMap(), whitelisted_legacy_custom_derives: Vec::new(), - warned_proc_macros: FxHashSet(), potentially_unused_imports: Vec::new(), struct_constructors: DefIdMap(), found_unresolved_macro: false, @@ -4602,7 +4595,6 @@ fn report_ambiguity_error(&self, ident: Ident, b1: &NameBinding, b2: &NameBindin fn report_errors(&mut self, krate: &Crate) { self.report_with_use_injections(krate); - self.report_proc_macro_import(krate); let mut reported_spans = FxHashSet(); for &(span_use, span_def) in &self.macro_expanded_macro_export_errors { diff --git a/src/librustc_resolve/macros.rs b/src/librustc_resolve/macros.rs index d955a21ef23..b9be52d8e05 100644 --- a/src/librustc_resolve/macros.rs +++ b/src/librustc_resolve/macros.rs @@ -19,7 +19,6 @@ use rustc::hir::def::{Def, NonMacroAttrKind}; use rustc::hir::map::{self, DefCollector}; use rustc::{ty, lint}; -use rustc::middle::cstore::CrateStore; use syntax::ast::{self, Name, Ident}; use syntax::attr; use syntax::errors::DiagnosticBuilder; @@ -110,14 +109,6 @@ pub struct ParentScope<'a> { crate derives: Vec, } -pub struct ProcMacError { - crate_name: Symbol, - name: Symbol, - module: ast::NodeId, - use_span: Span, - warn_msg: &'static str, -} - // Macro namespace is separated into two sub-namespaces, one for bang macros and // one for attribute-like macros (attributes, derives). // We ignore resolutions from one sub-namespace when searching names in scope for another. @@ -980,7 +971,6 @@ pub fn finalize_current_module_macro_resolutions(&mut self) { check_consistency(self, binding.def_ignoring_ambiguity()); if from_prelude { self.record_use(ident, MacroNS, binding); - self.err_if_macro_use_proc_macro(ident.name, span, binding); } } }; @@ -1132,69 +1122,6 @@ pub fn define_macro(&mut self, } } - /// Error if `ext` is a Macros 1.1 procedural macro being imported by `#[macro_use]` - fn err_if_macro_use_proc_macro(&mut self, name: Name, use_span: Span, - binding: &NameBinding<'a>) { - let krate = match binding.def() { - Def::NonMacroAttr(..) | Def::Err => return, - Def::Macro(def_id, _) => def_id.krate, - _ => unreachable!(), - }; - - // Plugin-based syntax extensions are exempt from this check - if krate == CrateNum::BuiltinMacros { return; } - - let ext = binding.get_macro(self); - - match *ext { - // If `ext` is a procedural macro, check if we've already warned about it - SyntaxExtension::AttrProcMacro(..) | SyntaxExtension::ProcMacro { .. } => - if !self.warned_proc_macros.insert(name) { return; }, - _ => return, - } - - let warn_msg = match *ext { - SyntaxExtension::AttrProcMacro(..) => - "attribute procedural macros cannot be imported with `#[macro_use]`", - SyntaxExtension::ProcMacro { .. } => - "procedural macros cannot be imported with `#[macro_use]`", - _ => return, - }; - - let def_id = self.current_module.normal_ancestor_id; - let node_id = self.definitions.as_local_node_id(def_id).unwrap(); - - self.proc_mac_errors.push(ProcMacError { - crate_name: self.cstore.crate_name_untracked(krate), - name, - module: node_id, - use_span, - warn_msg, - }); - } - - pub fn report_proc_macro_import(&mut self, krate: &ast::Crate) { - for err in self.proc_mac_errors.drain(..) { - let (span, found_use) = ::UsePlacementFinder::check(krate, err.module); - - if let Some(span) = span { - let found_use = if found_use { "" } else { "\n" }; - self.session.struct_span_err(err.use_span, err.warn_msg) - .span_suggestion_with_applicability( - span, - "instead, import the procedural macro like any other item", - format!("use {}::{};{}", err.crate_name, err.name, found_use), - Applicability::MachineApplicable - ).emit(); - } else { - self.session.struct_span_err(err.use_span, err.warn_msg) - .help(&format!("instead, import the procedural macro like any other item: \ - `use {}::{};`", err.crate_name, err.name)) - .emit(); - } - } - } - fn gate_legacy_custom_derive(&mut self, name: Symbol, span: Span) { if !self.session.features_untracked().custom_derive { let sess = &self.session.parse_sess; diff --git a/src/test/compile-fail-fulldeps/proc-macro/auxiliary/attr_proc_macro.rs b/src/test/compile-fail-fulldeps/proc-macro/auxiliary/attr_proc_macro.rs deleted file mode 100644 index 679cb772868..00000000000 --- a/src/test/compile-fail-fulldeps/proc-macro/auxiliary/attr_proc_macro.rs +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2016 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -// force-host -// no-prefer-dynamic - -#![crate_type = "proc-macro"] - -extern crate proc_macro; - -use proc_macro::TokenStream; - -#[proc_macro_attribute] -pub fn attr_proc_macro(_: TokenStream, input: TokenStream) -> TokenStream { - input -} diff --git a/src/test/compile-fail-fulldeps/proc-macro/auxiliary/bang_proc_macro.rs b/src/test/compile-fail-fulldeps/proc-macro/auxiliary/bang_proc_macro.rs deleted file mode 100644 index 6484725814a..00000000000 --- a/src/test/compile-fail-fulldeps/proc-macro/auxiliary/bang_proc_macro.rs +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2016 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -// force-host -// no-prefer-dynamic - -#![crate_type = "proc-macro"] - -extern crate proc_macro; - -use proc_macro::TokenStream; - -#[proc_macro] -pub fn bang_proc_macro(input: TokenStream) -> TokenStream { - input -} diff --git a/src/test/compile-fail-fulldeps/proc-macro/macro-use-attr.rs b/src/test/compile-fail-fulldeps/proc-macro/macro-use-attr.rs deleted file mode 100644 index 0fcb9efc1c9..00000000000 --- a/src/test/compile-fail-fulldeps/proc-macro/macro-use-attr.rs +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2016 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -// aux-build:attr_proc_macro.rs - -#[macro_use] extern crate attr_proc_macro; - -#[attr_proc_macro] -//~^ ERROR: attribute procedural macros cannot be imported with `#[macro_use]` -struct Foo; - -fn main() { - let _ = Foo; -} diff --git a/src/test/compile-fail-fulldeps/proc-macro/macro-use-bang.rs b/src/test/compile-fail-fulldeps/proc-macro/macro-use-bang.rs deleted file mode 100644 index be5b8c39f1d..00000000000 --- a/src/test/compile-fail-fulldeps/proc-macro/macro-use-bang.rs +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2016 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -// aux-build:bang_proc_macro.rs - -#![feature(proc_macro_non_items)] - -#[macro_use] -extern crate bang_proc_macro; - -fn main() { - bang_proc_macro!(println!("Hello, world!")); - //~^ ERROR: procedural macros cannot be imported with `#[macro_use]` -} diff --git a/src/test/ui-fulldeps/proc-macro/auxiliary/attr_proc_macro.rs b/src/test/ui-fulldeps/proc-macro/auxiliary/attr_proc_macro.rs new file mode 100644 index 00000000000..679cb772868 --- /dev/null +++ b/src/test/ui-fulldeps/proc-macro/auxiliary/attr_proc_macro.rs @@ -0,0 +1,23 @@ +// Copyright 2016 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// force-host +// no-prefer-dynamic + +#![crate_type = "proc-macro"] + +extern crate proc_macro; + +use proc_macro::TokenStream; + +#[proc_macro_attribute] +pub fn attr_proc_macro(_: TokenStream, input: TokenStream) -> TokenStream { + input +} diff --git a/src/test/ui-fulldeps/proc-macro/auxiliary/bang_proc_macro.rs b/src/test/ui-fulldeps/proc-macro/auxiliary/bang_proc_macro.rs new file mode 100644 index 00000000000..6484725814a --- /dev/null +++ b/src/test/ui-fulldeps/proc-macro/auxiliary/bang_proc_macro.rs @@ -0,0 +1,23 @@ +// Copyright 2016 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// force-host +// no-prefer-dynamic + +#![crate_type = "proc-macro"] + +extern crate proc_macro; + +use proc_macro::TokenStream; + +#[proc_macro] +pub fn bang_proc_macro(input: TokenStream) -> TokenStream { + input +} diff --git a/src/test/ui-fulldeps/proc-macro/macro-use-attr.rs b/src/test/ui-fulldeps/proc-macro/macro-use-attr.rs new file mode 100644 index 00000000000..904562e903d --- /dev/null +++ b/src/test/ui-fulldeps/proc-macro/macro-use-attr.rs @@ -0,0 +1,21 @@ +// Copyright 2016 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// compile-pass +// aux-build:attr_proc_macro.rs + +#[macro_use] extern crate attr_proc_macro; + +#[attr_proc_macro] +struct Foo; + +fn main() { + let _ = Foo; +} diff --git a/src/test/ui-fulldeps/proc-macro/macro-use-bang.rs b/src/test/ui-fulldeps/proc-macro/macro-use-bang.rs new file mode 100644 index 00000000000..9a54696d1f0 --- /dev/null +++ b/src/test/ui-fulldeps/proc-macro/macro-use-bang.rs @@ -0,0 +1,21 @@ +// Copyright 2016 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// compile-pass +// aux-build:bang_proc_macro.rs + +#![feature(proc_macro_non_items)] + +#[macro_use] +extern crate bang_proc_macro; + +fn main() { + bang_proc_macro!(println!("Hello, world!")); +}