@@ -1361,6 +1361,7 @@ pub struct Resolver<'a, 'b: 'a> {
13611361 graph_root : Module < ' a > ,
13621362
13631363 prelude : Option < Module < ' a > > ,
1364+ extern_prelude : FxHashSet < Name > ,
13641365
13651366 /// n.b. This is used only for better diagnostics, not name resolution itself.
13661367 has_self : FxHashSet < DefId > ,
@@ -1674,6 +1675,17 @@ impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> {
16741675 DefCollector :: new ( & mut definitions, Mark :: root ( ) )
16751676 . collect_root ( crate_name, session. local_crate_disambiguator ( ) ) ;
16761677
1678+ let mut extern_prelude: FxHashSet < Name > =
1679+ session. opts . externs . iter ( ) . map ( |kv| Symbol :: intern ( kv. 0 ) ) . collect ( ) ;
1680+
1681+ // HACK(eddyb) this ignore the `no_{core,std}` attributes.
1682+ // FIXME(eddyb) warn (elsewhere) if core/std is used with `no_{core,std}`.
1683+ // if !attr::contains_name(&krate.attrs, "no_core") {
1684+ // if !attr::contains_name(&krate.attrs, "no_std") {
1685+ extern_prelude. insert ( Symbol :: intern ( "core" ) ) ;
1686+ extern_prelude. insert ( Symbol :: intern ( "std" ) ) ;
1687+ extern_prelude. insert ( Symbol :: intern ( "meta" ) ) ;
1688+
16771689 let mut invocations = FxHashMap ( ) ;
16781690 invocations. insert ( Mark :: root ( ) ,
16791691 arenas. alloc_invocation_data ( InvocationData :: root ( graph_root) ) ) ;
@@ -1692,6 +1704,7 @@ impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> {
16921704 // AST.
16931705 graph_root,
16941706 prelude : None ,
1707+ extern_prelude,
16951708
16961709 has_self : FxHashSet ( ) ,
16971710 field_names : FxHashMap ( ) ,
@@ -1963,7 +1976,7 @@ impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> {
19631976
19641977 if !module. no_implicit_prelude {
19651978 // `record_used` means that we don't try to load crates during speculative resolution
1966- if record_used && ns == TypeNS && self . session . extern_prelude . contains ( & ident. name ) {
1979+ if record_used && ns == TypeNS && self . extern_prelude . contains ( & ident. name ) {
19671980 let crate_id = self . crate_loader . process_path_extern ( ident. name , ident. span ) ;
19681981 let crate_root = self . get_module ( DefId { krate : crate_id, index : CRATE_DEF_INDEX } ) ;
19691982 self . populate_module_if_necessary ( & crate_root) ;
@@ -3950,7 +3963,7 @@ impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> {
39503963 } else {
39513964 // Items from the prelude
39523965 if !module. no_implicit_prelude {
3953- names. extend ( self . session . extern_prelude . iter ( ) . cloned ( ) ) ;
3966+ names. extend ( self . extern_prelude . iter ( ) . cloned ( ) ) ;
39543967 if let Some ( prelude) = self . prelude {
39553968 add_module_candidates ( prelude, & mut names) ;
39563969 }
@@ -4396,7 +4409,8 @@ impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> {
43964409 ) ;
43974410
43984411 if self . session . rust_2018 ( ) {
4399- for & name in & self . session . extern_prelude {
4412+ let extern_prelude_names = self . extern_prelude . clone ( ) ;
4413+ for & name in extern_prelude_names. iter ( ) {
44004414 let ident = Ident :: with_empty_ctxt ( name) ;
44014415 match self . crate_loader . maybe_process_path_extern ( name, ident. span ) {
44024416 Some ( crate_id) => {
0 commit comments