]> git.lizzy.rs Git - rust.git/commitdiff
resolve: Filter away macro prelude in modules with `#[no_implicit_prelude]` on 2018...
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>
Fri, 2 Nov 2018 21:07:56 +0000 (00:07 +0300)
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>
Fri, 2 Nov 2018 21:07:56 +0000 (00:07 +0300)
src/librustc/session/mod.rs
src/librustc_resolve/macros.rs
src/test/ui/hygiene/no_implicit_prelude-2018.rs [new file with mode: 0644]
src/test/ui/hygiene/no_implicit_prelude-2018.stderr [new file with mode: 0644]
src/test/ui/hygiene/no_implicit_prelude.rs

index a17825a877d88cb45ecaba6e31d2cc6a15e0860a..d5513080daf5fbeb9f271f37f7b234dcbf38d49b 100644 (file)
@@ -963,6 +963,10 @@ pub fn teach(&self, code: &DiagnosticId) -> bool {
         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
index d5f344346c2d17238fe4bd89eec7322b4bb72d5a..83c32a579ccb4f81db8236559207e392302a0449 100644 (file)
@@ -660,10 +660,13 @@ struct Flags: u8 {
                     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 @@ struct Flags: u8 {
                     }
                 }
                 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 (file)
index 0000000..3ad7435
--- /dev/null
@@ -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 (file)
index 0000000..370fc97
--- /dev/null
@@ -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
+
index bf07bc05491cc3752afd543338b08af9a5ff4c09..5b6041945abea76a2f9d57e39d0b591a66ab9798 100644 (file)
@@ -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() {}