Skip to content

Commit faefc83

Browse files
committed
Feature gate extern prelude additions from extern crate items
Fix rustdoc and fulldeps tests
1 parent 0f625ac commit faefc83

13 files changed

+143
-9
lines changed

src/librustc_resolve/lib.rs

+10-2
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ use syntax::ast::{self, Name, NodeId, Ident, FloatTy, IntTy, UintTy};
5858
use syntax::ext::base::SyntaxExtension;
5959
use syntax::ext::base::Determinacy::{self, Determined, Undetermined};
6060
use syntax::ext::base::MacroKind;
61+
use syntax::feature_gate::{emit_feature_err, GateIssue};
6162
use syntax::symbol::{Symbol, keywords};
6263
use syntax::util::lev_distance::find_best_match_for_name;
6364

@@ -1971,7 +1972,7 @@ impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> {
19711972

19721973
if !module.no_implicit_prelude {
19731974
if ns == TypeNS {
1974-
if let Some(binding) = self.extern_prelude_get(ident, !record_used) {
1975+
if let Some(binding) = self.extern_prelude_get(ident, !record_used, false) {
19751976
return Some(LexicalScopeBinding::Item(binding));
19761977
}
19771978
}
@@ -4820,10 +4821,17 @@ impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> {
48204821
self.name_already_seen.insert(name, span);
48214822
}
48224823

4823-
fn extern_prelude_get(&mut self, ident: Ident, speculative: bool)
4824+
fn extern_prelude_get(&mut self, ident: Ident, speculative: bool, skip_feature_gate: bool)
48244825
-> Option<&'a NameBinding<'a>> {
48254826
self.extern_prelude.get(&ident.modern()).cloned().and_then(|entry| {
48264827
if let Some(binding) = entry.extern_crate_item {
4828+
if !speculative && !skip_feature_gate && entry.introduced_by_item &&
4829+
!self.session.features_untracked().extern_crate_item_prelude {
4830+
emit_feature_err(&self.session.parse_sess, "extern_crate_item_prelude",
4831+
ident.span, GateIssue::Language,
4832+
"use of extern prelude names introduced \
4833+
with `extern crate` items is unstable");
4834+
}
48274835
Some(binding)
48284836
} else {
48294837
let crate_id = if !speculative {

src/librustc_resolve/macros.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -693,7 +693,8 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
693693
WhereToResolve::ExternPrelude => {
694694
let mut result = Err(Determinacy::Determined);
695695
if use_prelude {
696-
if let Some(binding) = self.extern_prelude_get(ident, !record_used) {
696+
if let Some(binding) = self.extern_prelude_get(ident, !record_used,
697+
innermost_result.is_some()) {
697698
result = Ok((binding, Flags::PRELUDE, Flags::empty()));
698699
}
699700
}

src/librustc_resolve/resolve_imports.rs

+9-2
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ impl<'a, 'crateloader> Resolver<'a, 'crateloader> {
222222
ns == TypeNS &&
223223
!ident.is_path_segment_keyword()
224224
{
225-
if let Some(binding) = self.extern_prelude_get(ident, !record_used) {
225+
if let Some(binding) = self.extern_prelude_get(ident, !record_used, false) {
226226
let module = self.get_module(binding.def().def_id());
227227
self.populate_module_if_necessary(module);
228228
return Ok(binding);
@@ -742,7 +742,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
742742
for ((span, _, ns), results) in uniform_paths_canaries {
743743
let name = results.name;
744744
let external_crate = if ns == TypeNS {
745-
self.extern_prelude_get(Ident::with_empty_ctxt(name), true)
745+
self.extern_prelude_get(Ident::with_empty_ctxt(name), true, false)
746746
.map(|binding| binding.def())
747747
} else {
748748
None
@@ -1023,6 +1023,13 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
10231023
Some(this.dummy_binding);
10241024
}
10251025
}
1026+
if record_used && ns == TypeNS {
1027+
if let ModuleOrUniformRoot::UniformRoot(..) = module {
1028+
// Make sure single-segment import is resolved non-speculatively
1029+
// at least once to report the feature error.
1030+
this.extern_prelude_get(ident, false, false);
1031+
}
1032+
}
10261033
}
10271034
});
10281035

src/librustdoc/core.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -476,7 +476,9 @@ pub fn run_core(search_paths: SearchPaths,
476476
trait_map: resolver.trait_map.clone(),
477477
maybe_unused_trait_imports: resolver.maybe_unused_trait_imports.clone(),
478478
maybe_unused_extern_crates: resolver.maybe_unused_extern_crates.clone(),
479-
extern_prelude: resolver.extern_prelude.clone(),
479+
extern_prelude: resolver.extern_prelude.iter().map(|(ident, entry)| {
480+
(ident.name, entry.introduced_by_item)
481+
}).collect(),
480482
};
481483
let analysis = ty::CrateAnalysis {
482484
access_levels: Lrc::new(AccessLevels::default()),

src/libsyntax/feature_gate.rs

+3
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,9 @@ declare_features! (
501501

502502
// Allows `const _: TYPE = VALUE`
503503
(active, underscore_const_names, "1.31.0", Some(54912), None),
504+
505+
// `extern crate foo as bar;` puts `bar` into extern prelude.
506+
(active, extern_crate_item_prelude, "1.31.0", Some(54658), None),
504507
);
505508

506509
declare_features! (

src/test/ui-fulldeps/proc-macro/extern-prelude-extern-crate-proc-macro.rs

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// compile-pass
22
// edition:2018
33

4+
#![feature(extern_crate_item_prelude)]
5+
46
extern crate proc_macro;
57
use proc_macro::TokenStream; // OK
68

src/test/ui-fulldeps/resolve-error.stderr

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ error: cannot find derive macro `attr_proc_macra` in this scope
2020
--> $DIR/resolve-error.rs:54:10
2121
|
2222
LL | #[derive(attr_proc_macra)]
23-
| ^^^^^^^^^^^^^^^
23+
| ^^^^^^^^^^^^^^^ help: try: `attr_proc_macro`
2424

2525
error: cannot find macro `FooWithLongNama!` in this scope
2626
--> $DIR/resolve-error.rs:59:5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// edition:2018
2+
3+
#![feature(alloc)]
4+
5+
extern crate alloc;
6+
7+
mod in_scope {
8+
fn check() {
9+
let v = alloc::vec![0];
10+
//~^ ERROR use of extern prelude names introduced with `extern crate` items is unstable
11+
type A = alloc::boxed::Box<u8>;
12+
//~^ ERROR use of extern prelude names introduced with `extern crate` items is unstable
13+
}
14+
}
15+
16+
mod absolute {
17+
fn check() {
18+
let v = ::alloc::vec![0];
19+
//~^ ERROR use of extern prelude names introduced with `extern crate` items is unstable
20+
type A = ::alloc::boxed::Box<u8>;
21+
//~^ ERROR use of extern prelude names introduced with `extern crate` items is unstable
22+
}
23+
}
24+
25+
mod import_in_scope {
26+
use alloc;
27+
//~^ ERROR use of extern prelude names introduced with `extern crate` items is unstable
28+
use alloc::boxed;
29+
//~^ ERROR use of extern prelude names introduced with `extern crate` items is unstable
30+
}
31+
32+
mod import_absolute {
33+
use ::alloc;
34+
//~^ ERROR use of extern prelude names introduced with `extern crate` items is unstable
35+
use ::alloc::boxed;
36+
//~^ ERROR use of extern prelude names introduced with `extern crate` items is unstable
37+
}
38+
39+
fn main() {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
error[E0658]: use of extern prelude names introduced with `extern crate` items is unstable (see issue #54658)
2+
--> $DIR/feature-gate-extern_crate_item_prelude.rs:26:9
3+
|
4+
LL | use alloc;
5+
| ^^^^^
6+
|
7+
= help: add #![feature(extern_crate_item_prelude)] to the crate attributes to enable
8+
9+
error[E0658]: use of extern prelude names introduced with `extern crate` items is unstable (see issue #54658)
10+
--> $DIR/feature-gate-extern_crate_item_prelude.rs:28:9
11+
|
12+
LL | use alloc::boxed;
13+
| ^^^^^
14+
|
15+
= help: add #![feature(extern_crate_item_prelude)] to the crate attributes to enable
16+
17+
error[E0658]: use of extern prelude names introduced with `extern crate` items is unstable (see issue #54658)
18+
--> $DIR/feature-gate-extern_crate_item_prelude.rs:33:11
19+
|
20+
LL | use ::alloc;
21+
| ^^^^^
22+
|
23+
= help: add #![feature(extern_crate_item_prelude)] to the crate attributes to enable
24+
25+
error[E0658]: use of extern prelude names introduced with `extern crate` items is unstable (see issue #54658)
26+
--> $DIR/feature-gate-extern_crate_item_prelude.rs:35:11
27+
|
28+
LL | use ::alloc::boxed;
29+
| ^^^^^
30+
|
31+
= help: add #![feature(extern_crate_item_prelude)] to the crate attributes to enable
32+
33+
error[E0658]: use of extern prelude names introduced with `extern crate` items is unstable (see issue #54658)
34+
--> $DIR/feature-gate-extern_crate_item_prelude.rs:9:17
35+
|
36+
LL | let v = alloc::vec![0];
37+
| ^^^^^
38+
|
39+
= help: add #![feature(extern_crate_item_prelude)] to the crate attributes to enable
40+
41+
error[E0658]: use of extern prelude names introduced with `extern crate` items is unstable (see issue #54658)
42+
--> $DIR/feature-gate-extern_crate_item_prelude.rs:11:18
43+
|
44+
LL | type A = alloc::boxed::Box<u8>;
45+
| ^^^^^
46+
|
47+
= help: add #![feature(extern_crate_item_prelude)] to the crate attributes to enable
48+
49+
error[E0658]: use of extern prelude names introduced with `extern crate` items is unstable (see issue #54658)
50+
--> $DIR/feature-gate-extern_crate_item_prelude.rs:18:19
51+
|
52+
LL | let v = ::alloc::vec![0];
53+
| ^^^^^
54+
|
55+
= help: add #![feature(extern_crate_item_prelude)] to the crate attributes to enable
56+
57+
error[E0658]: use of extern prelude names introduced with `extern crate` items is unstable (see issue #54658)
58+
--> $DIR/feature-gate-extern_crate_item_prelude.rs:20:20
59+
|
60+
LL | type A = ::alloc::boxed::Box<u8>;
61+
| ^^^^^
62+
|
63+
= help: add #![feature(extern_crate_item_prelude)] to the crate attributes to enable
64+
65+
error: aborting due to 8 previous errors
66+
67+
For more information about this error, try `rustc --explain E0658`.

src/test/ui/imports/extern-prelude-extern-crate-cfg.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// compile-pass
22
// compile-flags:--cfg my_feature
33

4+
#![feature(extern_crate_item_prelude)]
45
#![no_std]
56

67
#[cfg(my_feature)]

src/test/ui/imports/extern-prelude-extern-crate-pass.rs

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// compile-pass
22
// aux-build:two_macros.rs
33

4+
#![feature(extern_crate_item_prelude)]
5+
46
extern crate two_macros;
57

68
mod m {

src/test/ui/imports/extern-prelude-extern-crate-restricted-shadowing.rs

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
// aux-build:two_macros.rs
22

3+
#![feature(extern_crate_item_prelude)]
4+
35
macro_rules! define_vec {
46
() => {
57
extern crate std as Vec;

src/test/ui/imports/extern-prelude-extern-crate-restricted-shadowing.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
error[E0659]: `Vec` is ambiguous
2-
--> $DIR/extern-prelude-extern-crate-restricted-shadowing.rs:13:9
2+
--> $DIR/extern-prelude-extern-crate-restricted-shadowing.rs:15:9
33
|
44
LL | Vec::panic!(); //~ ERROR `Vec` is ambiguous
55
| ^^^ ambiguous name
66
|
77
note: `Vec` could refer to the name defined here
8-
--> $DIR/extern-prelude-extern-crate-restricted-shadowing.rs:5:9
8+
--> $DIR/extern-prelude-extern-crate-restricted-shadowing.rs:7:9
99
|
1010
LL | extern crate std as Vec;
1111
| ^^^^^^^^^^^^^^^^^^^^^^^^

0 commit comments

Comments
 (0)