From 9ed9d6d0d09a690e81841f1fc2e02f16bc9ee2c5 Mon Sep 17 00:00:00 2001 From: Vadim Petrochenkov Date: Sat, 3 Nov 2018 00:07:56 +0300 Subject: [PATCH] resolve: Filter away macro prelude in modules with `#[no_implicit_prelude]` on 2018 edition --- src/librustc/session/mod.rs | 4 ++++ src/librustc_resolve/macros.rs | 12 ++++++++---- src/test/ui/hygiene/no_implicit_prelude-2018.rs | 11 +++++++++++ src/test/ui/hygiene/no_implicit_prelude-2018.stderr | 10 ++++++++++ src/test/ui/hygiene/no_implicit_prelude.rs | 5 ++++- 5 files changed, 37 insertions(+), 5 deletions(-) create mode 100644 src/test/ui/hygiene/no_implicit_prelude-2018.rs create mode 100644 src/test/ui/hygiene/no_implicit_prelude-2018.stderr diff --git a/src/librustc/session/mod.rs b/src/librustc/session/mod.rs index a17825a877d88..d5513080daf5f 100644 --- a/src/librustc/session/mod.rs +++ b/src/librustc/session/mod.rs @@ -963,6 +963,10 @@ impl Session { self.opts.debugging_opts.teach && self.diagnostic().must_teach(code) } + pub fn rust_2015(&self) -> bool { + self.opts.edition == Edition::Edition2015 + } + /// Are we allowed to use features from the Rust 2018 edition? pub fn rust_2018(&self) -> bool { self.opts.edition >= Edition::Edition2018 diff --git a/src/librustc_resolve/macros.rs b/src/librustc_resolve/macros.rs index d5f344346c2d1..83c32a579ccb4 100644 --- a/src/librustc_resolve/macros.rs +++ b/src/librustc_resolve/macros.rs @@ -660,10 +660,13 @@ impl<'a, 'cl> Resolver<'a, 'cl> { binding.map(|binding| (binding, Flags::MODULE, Flags::empty())) } WhereToResolve::MacroUsePrelude => { - match self.macro_use_prelude.get(&ident.name).cloned() { - Some(binding) => Ok((binding, Flags::PRELUDE, Flags::empty())), - None => Err(Determinacy::Determined), + let mut result = Err(Determinacy::Determined); + if use_prelude || self.session.rust_2015() { + if let Some(binding) = self.macro_use_prelude.get(&ident.name).cloned() { + result = Ok((binding, Flags::PRELUDE, Flags::empty())); + } } + result } WhereToResolve::BuiltinMacros => { match self.builtin_macros.get(&ident.name).cloned() { @@ -682,7 +685,8 @@ impl<'a, 'cl> Resolver<'a, 'cl> { } } WhereToResolve::LegacyPluginHelpers => { - if self.session.plugin_attributes.borrow().iter() + if (use_prelude || self.session.rust_2015()) && + self.session.plugin_attributes.borrow().iter() .any(|(name, _)| ident.name == &**name) { let binding = (Def::NonMacroAttr(NonMacroAttrKind::LegacyPluginHelper), ty::Visibility::Public, ident.span, Mark::root()) diff --git a/src/test/ui/hygiene/no_implicit_prelude-2018.rs b/src/test/ui/hygiene/no_implicit_prelude-2018.rs new file mode 100644 index 0000000000000..3ad7435fecf29 --- /dev/null +++ b/src/test/ui/hygiene/no_implicit_prelude-2018.rs @@ -0,0 +1,11 @@ +// edition:2018 + +#[no_implicit_prelude] +mod bar { + fn f() { + ::std::print!(""); // OK + print!(); //~ ERROR cannot find macro `print!` in this scope + } +} + +fn main() {} diff --git a/src/test/ui/hygiene/no_implicit_prelude-2018.stderr b/src/test/ui/hygiene/no_implicit_prelude-2018.stderr new file mode 100644 index 0000000000000..370fc9784ad4d --- /dev/null +++ b/src/test/ui/hygiene/no_implicit_prelude-2018.stderr @@ -0,0 +1,10 @@ +error: cannot find macro `print!` in this scope + --> $DIR/no_implicit_prelude-2018.rs:7:9 + | +LL | print!(); //~ ERROR cannot find macro `print!` in this scope + | ^^^^^ + | + = help: have you added the `#[macro_use]` on the module/import? + +error: aborting due to previous error + diff --git a/src/test/ui/hygiene/no_implicit_prelude.rs b/src/test/ui/hygiene/no_implicit_prelude.rs index bf07bc05491cc..5b6041945abea 100644 --- a/src/test/ui/hygiene/no_implicit_prelude.rs +++ b/src/test/ui/hygiene/no_implicit_prelude.rs @@ -21,7 +21,10 @@ mod bar { Vec::new(); //~ ERROR failed to resolve ().clone() //~ ERROR no method named `clone` found } - fn f() { ::foo::m!(); } + fn f() { + ::foo::m!(); + println!(); // OK on 2015 edition (at least for now) + } } fn main() {}