]> git.lizzy.rs Git - rust.git/commitdiff
Feature gate extern prelude additions from `extern crate` items
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>
Sat, 20 Oct 2018 17:26:24 +0000 (20:26 +0300)
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>
Tue, 23 Oct 2018 21:14:50 +0000 (00:14 +0300)
Fix rustdoc and fulldeps tests

13 files changed:
src/librustc_resolve/lib.rs
src/librustc_resolve/macros.rs
src/librustc_resolve/resolve_imports.rs
src/librustdoc/core.rs
src/libsyntax/feature_gate.rs
src/test/ui-fulldeps/proc-macro/extern-prelude-extern-crate-proc-macro.rs
src/test/ui-fulldeps/resolve-error.stderr
src/test/ui/feature-gates/feature-gate-extern_crate_item_prelude.rs [new file with mode: 0644]
src/test/ui/feature-gates/feature-gate-extern_crate_item_prelude.stderr [new file with mode: 0644]
src/test/ui/imports/extern-prelude-extern-crate-cfg.rs
src/test/ui/imports/extern-prelude-extern-crate-pass.rs
src/test/ui/imports/extern-prelude-extern-crate-restricted-shadowing.rs
src/test/ui/imports/extern-prelude-extern-crate-restricted-shadowing.stderr

index 67dc749cb0051e3c17537dc735f33cf9f83be091..2c21067bd58c8881debec221bacd46ac150e3a76 100644 (file)
@@ -58,6 +58,7 @@
 use syntax::ext::base::SyntaxExtension;
 use syntax::ext::base::Determinacy::{self, Determined, Undetermined};
 use syntax::ext::base::MacroKind;
+use syntax::feature_gate::{emit_feature_err, GateIssue};
 use syntax::symbol::{Symbol, keywords};
 use syntax::util::lev_distance::find_best_match_for_name;
 
@@ -1971,7 +1972,7 @@ fn resolve_ident_in_lexical_scope(&mut self,
 
         if !module.no_implicit_prelude {
             if ns == TypeNS {
-                if let Some(binding) = self.extern_prelude_get(ident, !record_used) {
+                if let Some(binding) = self.extern_prelude_get(ident, !record_used, false) {
                     return Some(LexicalScopeBinding::Item(binding));
                 }
             }
@@ -4820,10 +4821,17 @@ fn report_conflict<'b>(&mut self,
         self.name_already_seen.insert(name, span);
     }
 
-    fn extern_prelude_get(&mut self, ident: Ident, speculative: bool)
+    fn extern_prelude_get(&mut self, ident: Ident, speculative: bool, skip_feature_gate: bool)
                           -> Option<&'a NameBinding<'a>> {
         self.extern_prelude.get(&ident.modern()).cloned().and_then(|entry| {
             if let Some(binding) = entry.extern_crate_item {
+                if !speculative && !skip_feature_gate && entry.introduced_by_item &&
+                   !self.session.features_untracked().extern_crate_item_prelude {
+                    emit_feature_err(&self.session.parse_sess, "extern_crate_item_prelude",
+                                     ident.span, GateIssue::Language,
+                                     "use of extern prelude names introduced \
+                                      with `extern crate` items is unstable");
+                }
                 Some(binding)
             } else {
                 let crate_id = if !speculative {
index 2f7e300b8ff38531ef33b187131ae579950261f3..3345e01a929c773404cb4cf3803afb7a8f756619 100644 (file)
@@ -693,7 +693,8 @@ struct Flags: u8 {
                 WhereToResolve::ExternPrelude => {
                     let mut result = Err(Determinacy::Determined);
                     if use_prelude {
-                        if let Some(binding) = self.extern_prelude_get(ident, !record_used) {
+                        if let Some(binding) = self.extern_prelude_get(ident, !record_used,
+                                                                       innermost_result.is_some()) {
                             result = Ok((binding, Flags::PRELUDE, Flags::empty()));
                         }
                     }
index a3aa50fe0276cc9522499f647924a7e8b07e95c0..6c73f1bd0f8c5af59f96d582dc1a7a4f7d6b998e 100644 (file)
@@ -222,7 +222,7 @@ pub fn resolve_ident_in_module_unadjusted(&mut self,
                     ns == TypeNS &&
                     !ident.is_path_segment_keyword()
                 {
-                    if let Some(binding) = self.extern_prelude_get(ident, !record_used) {
+                    if let Some(binding) = self.extern_prelude_get(ident, !record_used, false) {
                         let module = self.get_module(binding.def().def_id());
                         self.populate_module_if_necessary(module);
                         return Ok(binding);
@@ -742,7 +742,7 @@ struct UniformPathsCanaryResults<'a> {
         for ((span, _, ns), results) in uniform_paths_canaries {
             let name = results.name;
             let external_crate = if ns == TypeNS {
-                self.extern_prelude_get(Ident::with_empty_ctxt(name), true)
+                self.extern_prelude_get(Ident::with_empty_ctxt(name), true, false)
                     .map(|binding| binding.def())
             } else {
                 None
@@ -1023,6 +1023,13 @@ fn finalize_import(&mut self, directive: &'b ImportDirective<'b>) -> Option<(Spa
                             Some(this.dummy_binding);
                     }
                 }
+                if record_used && ns == TypeNS {
+                    if let ModuleOrUniformRoot::UniformRoot(..) = module {
+                        // Make sure single-segment import is resolved non-speculatively
+                        // at least once to report the feature error.
+                        this.extern_prelude_get(ident, false, false);
+                    }
+                }
             }
         });
 
index 49f13df64d6ea15dade9a106083fb3ff3e0eaf4f..8f9c3fa4b7f205a7cba10e0b0ff67b3e18356832 100644 (file)
@@ -476,7 +476,9 @@ pub fn run_core(search_paths: SearchPaths,
             trait_map: resolver.trait_map.clone(),
             maybe_unused_trait_imports: resolver.maybe_unused_trait_imports.clone(),
             maybe_unused_extern_crates: resolver.maybe_unused_extern_crates.clone(),
-            extern_prelude: resolver.extern_prelude.clone(),
+            extern_prelude: resolver.extern_prelude.iter().map(|(ident, entry)| {
+                (ident.name, entry.introduced_by_item)
+            }).collect(),
         };
         let analysis = ty::CrateAnalysis {
             access_levels: Lrc::new(AccessLevels::default()),
index d0f407aa9243b84d8b410756c9a417eeb844e5d6..2cd4fd92bc81e97c9000d617217ce9219fb1575e 100644 (file)
@@ -501,6 +501,9 @@ pub fn walk_feature_fields<F>(&self, mut f: F)
 
     // Allows `const _: TYPE = VALUE`
     (active, underscore_const_names, "1.31.0", Some(54912), None),
+
+    // `extern crate foo as bar;` puts `bar` into extern prelude.
+    (active, extern_crate_item_prelude, "1.31.0", Some(54658), None),
 );
 
 declare_features! (
index 25a2a37614778e4f4c62b843659154bf79123c61..e320ad9713542961e4acd73c72741b555e626a72 100644 (file)
@@ -1,6 +1,8 @@
 // compile-pass
 // edition:2018
 
+#![feature(extern_crate_item_prelude)]
+
 extern crate proc_macro;
 use proc_macro::TokenStream; // OK
 
index 278409c688ab9dcfa581b523f3578aa17ed13062..59ca668d4852553736fd0879fa9f54394204748c 100644 (file)
@@ -20,7 +20,7 @@ error: cannot find derive macro `attr_proc_macra` in this scope
   --> $DIR/resolve-error.rs:54:10
    |
 LL | #[derive(attr_proc_macra)]
-   |          ^^^^^^^^^^^^^^^
+   |          ^^^^^^^^^^^^^^^ help: try: `attr_proc_macro`
 
 error: cannot find macro `FooWithLongNama!` in this scope
   --> $DIR/resolve-error.rs:59:5
diff --git a/src/test/ui/feature-gates/feature-gate-extern_crate_item_prelude.rs b/src/test/ui/feature-gates/feature-gate-extern_crate_item_prelude.rs
new file mode 100644 (file)
index 0000000..eb7c52c
--- /dev/null
@@ -0,0 +1,39 @@
+// edition:2018
+
+#![feature(alloc)]
+
+extern crate alloc;
+
+mod in_scope {
+    fn check() {
+        let v = alloc::vec![0];
+        //~^ ERROR use of extern prelude names introduced with `extern crate` items is unstable
+        type A = alloc::boxed::Box<u8>;
+        //~^ ERROR use of extern prelude names introduced with `extern crate` items is unstable
+    }
+}
+
+mod absolute {
+    fn check() {
+        let v = ::alloc::vec![0];
+        //~^ ERROR use of extern prelude names introduced with `extern crate` items is unstable
+        type A = ::alloc::boxed::Box<u8>;
+        //~^ ERROR use of extern prelude names introduced with `extern crate` items is unstable
+    }
+}
+
+mod import_in_scope {
+    use alloc;
+    //~^ ERROR use of extern prelude names introduced with `extern crate` items is unstable
+    use alloc::boxed;
+    //~^ ERROR use of extern prelude names introduced with `extern crate` items is unstable
+}
+
+mod import_absolute {
+    use ::alloc;
+    //~^ ERROR use of extern prelude names introduced with `extern crate` items is unstable
+    use ::alloc::boxed;
+    //~^ ERROR use of extern prelude names introduced with `extern crate` items is unstable
+}
+
+fn main() {}
diff --git a/src/test/ui/feature-gates/feature-gate-extern_crate_item_prelude.stderr b/src/test/ui/feature-gates/feature-gate-extern_crate_item_prelude.stderr
new file mode 100644 (file)
index 0000000..4dec8a3
--- /dev/null
@@ -0,0 +1,67 @@
+error[E0658]: use of extern prelude names introduced with `extern crate` items is unstable (see issue #54658)
+  --> $DIR/feature-gate-extern_crate_item_prelude.rs:26:9
+   |
+LL |     use alloc;
+   |         ^^^^^
+   |
+   = help: add #![feature(extern_crate_item_prelude)] to the crate attributes to enable
+
+error[E0658]: use of extern prelude names introduced with `extern crate` items is unstable (see issue #54658)
+  --> $DIR/feature-gate-extern_crate_item_prelude.rs:28:9
+   |
+LL |     use alloc::boxed;
+   |         ^^^^^
+   |
+   = help: add #![feature(extern_crate_item_prelude)] to the crate attributes to enable
+
+error[E0658]: use of extern prelude names introduced with `extern crate` items is unstable (see issue #54658)
+  --> $DIR/feature-gate-extern_crate_item_prelude.rs:33:11
+   |
+LL |     use ::alloc;
+   |           ^^^^^
+   |
+   = help: add #![feature(extern_crate_item_prelude)] to the crate attributes to enable
+
+error[E0658]: use of extern prelude names introduced with `extern crate` items is unstable (see issue #54658)
+  --> $DIR/feature-gate-extern_crate_item_prelude.rs:35:11
+   |
+LL |     use ::alloc::boxed;
+   |           ^^^^^
+   |
+   = help: add #![feature(extern_crate_item_prelude)] to the crate attributes to enable
+
+error[E0658]: use of extern prelude names introduced with `extern crate` items is unstable (see issue #54658)
+  --> $DIR/feature-gate-extern_crate_item_prelude.rs:9:17
+   |
+LL |         let v = alloc::vec![0];
+   |                 ^^^^^
+   |
+   = help: add #![feature(extern_crate_item_prelude)] to the crate attributes to enable
+
+error[E0658]: use of extern prelude names introduced with `extern crate` items is unstable (see issue #54658)
+  --> $DIR/feature-gate-extern_crate_item_prelude.rs:11:18
+   |
+LL |         type A = alloc::boxed::Box<u8>;
+   |                  ^^^^^
+   |
+   = help: add #![feature(extern_crate_item_prelude)] to the crate attributes to enable
+
+error[E0658]: use of extern prelude names introduced with `extern crate` items is unstable (see issue #54658)
+  --> $DIR/feature-gate-extern_crate_item_prelude.rs:18:19
+   |
+LL |         let v = ::alloc::vec![0];
+   |                   ^^^^^
+   |
+   = help: add #![feature(extern_crate_item_prelude)] to the crate attributes to enable
+
+error[E0658]: use of extern prelude names introduced with `extern crate` items is unstable (see issue #54658)
+  --> $DIR/feature-gate-extern_crate_item_prelude.rs:20:20
+   |
+LL |         type A = ::alloc::boxed::Box<u8>;
+   |                    ^^^^^
+   |
+   = help: add #![feature(extern_crate_item_prelude)] to the crate attributes to enable
+
+error: aborting due to 8 previous errors
+
+For more information about this error, try `rustc --explain E0658`.
index 6117e5f6f3cd76681303d344f7805e49190b4af2..c48a65798b6c13bdc71345a6c291101206813a31 100644 (file)
@@ -1,6 +1,7 @@
 // compile-pass
 // compile-flags:--cfg my_feature
 
+#![feature(extern_crate_item_prelude)]
 #![no_std]
 
 #[cfg(my_feature)]
index bb4cf6ca99c752e87e87d5911a6c4ea272e45101..8c147dfd04a3c7b6173393f9234760550a17b42b 100644 (file)
@@ -1,6 +1,8 @@
 // compile-pass
 // aux-build:two_macros.rs
 
+#![feature(extern_crate_item_prelude)]
+
 extern crate two_macros;
 
 mod m {
index 3eefaf1267e88e1e52fc23546564a4cf5f44c4d7..732f1c4de2fb351aab488b7d157786a376a03368 100644 (file)
@@ -1,5 +1,7 @@
 // aux-build:two_macros.rs
 
+#![feature(extern_crate_item_prelude)]
+
 macro_rules! define_vec {
     () => {
         extern crate std as Vec;
index 6a28d74a343c95a4ce9fe319e13663cbdc480688..6c832e70e49a75396e2c0bdec13a58b9a34c86a9 100644 (file)
@@ -1,11 +1,11 @@
 error[E0659]: `Vec` is ambiguous
-  --> $DIR/extern-prelude-extern-crate-restricted-shadowing.rs:13:9
+  --> $DIR/extern-prelude-extern-crate-restricted-shadowing.rs:15:9
    |
 LL |         Vec::panic!(); //~ ERROR `Vec` is ambiguous
    |         ^^^ ambiguous name
    |
 note: `Vec` could refer to the name defined here
-  --> $DIR/extern-prelude-extern-crate-restricted-shadowing.rs:5:9
+  --> $DIR/extern-prelude-extern-crate-restricted-shadowing.rs:7:9
    |
 LL |         extern crate std as Vec;
    |         ^^^^^^^^^^^^^^^^^^^^^^^^