@@ -1360,6 +1360,7 @@ pub struct Resolver<'a, 'b: 'a> {
1360
1360
graph_root : Module < ' a > ,
1361
1361
1362
1362
prelude : Option < Module < ' a > > ,
1363
+ extern_prelude : FxHashSet < Name > ,
1363
1364
1364
1365
/// n.b. This is used only for better diagnostics, not name resolution itself.
1365
1366
has_self : FxHashSet < DefId > ,
@@ -1676,6 +1677,17 @@ impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> {
1676
1677
DefCollector :: new ( & mut definitions, Mark :: root ( ) )
1677
1678
. collect_root ( crate_name, session. local_crate_disambiguator ( ) ) ;
1678
1679
1680
+ let mut extern_prelude: FxHashSet < Name > =
1681
+ session. opts . externs . iter ( ) . map ( |kv| Symbol :: intern ( kv. 0 ) ) . collect ( ) ;
1682
+
1683
+ // HACK(eddyb) this ignore the `no_{core,std}` attributes.
1684
+ // FIXME(eddyb) warn (elsewhere) if core/std is used with `no_{core,std}`.
1685
+ // if !attr::contains_name(&krate.attrs, "no_core") {
1686
+ // if !attr::contains_name(&krate.attrs, "no_std") {
1687
+ extern_prelude. insert ( Symbol :: intern ( "core" ) ) ;
1688
+ extern_prelude. insert ( Symbol :: intern ( "std" ) ) ;
1689
+ extern_prelude. insert ( Symbol :: intern ( "meta" ) ) ;
1690
+
1679
1691
let mut invocations = FxHashMap ( ) ;
1680
1692
invocations. insert ( Mark :: root ( ) ,
1681
1693
arenas. alloc_invocation_data ( InvocationData :: root ( graph_root) ) ) ;
@@ -1694,6 +1706,7 @@ impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> {
1694
1706
// AST.
1695
1707
graph_root,
1696
1708
prelude : None ,
1709
+ extern_prelude,
1697
1710
1698
1711
has_self : FxHashSet ( ) ,
1699
1712
field_names : FxHashMap ( ) ,
@@ -1966,7 +1979,7 @@ impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> {
1966
1979
1967
1980
if !module. no_implicit_prelude {
1968
1981
// `record_used` means that we don't try to load crates during speculative resolution
1969
- if record_used && ns == TypeNS && self . session . extern_prelude . contains ( & ident. name ) {
1982
+ if record_used && ns == TypeNS && self . extern_prelude . contains ( & ident. name ) {
1970
1983
let crate_id = self . crate_loader . process_path_extern ( ident. name , ident. span ) ;
1971
1984
let crate_root = self . get_module ( DefId { krate : crate_id, index : CRATE_DEF_INDEX } ) ;
1972
1985
self . populate_module_if_necessary ( & crate_root) ;
@@ -4018,7 +4031,7 @@ impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> {
4018
4031
} else {
4019
4032
// Items from the prelude
4020
4033
if !module. no_implicit_prelude {
4021
- names. extend ( self . session . extern_prelude . iter ( ) . cloned ( ) ) ;
4034
+ names. extend ( self . extern_prelude . iter ( ) . cloned ( ) ) ;
4022
4035
if let Some ( prelude) = self . prelude {
4023
4036
add_module_candidates ( prelude, & mut names) ;
4024
4037
}
@@ -4464,7 +4477,8 @@ impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> {
4464
4477
) ;
4465
4478
4466
4479
if self . session . rust_2018 ( ) {
4467
- for & name in & self . session . extern_prelude {
4480
+ let extern_prelude_names = self . extern_prelude . clone ( ) ;
4481
+ for & name in extern_prelude_names. iter ( ) {
4468
4482
let ident = Ident :: with_empty_ctxt ( name) ;
4469
4483
match self . crate_loader . maybe_process_path_extern ( name, ident. span ) {
4470
4484
Some ( crate_id) => {
0 commit comments