@@ -1360,6 +1360,7 @@ pub struct Resolver<'a, 'b: 'a> {
13601360 graph_root : Module < ' a > ,
13611361
13621362 prelude : Option < Module < ' a > > ,
1363+ extern_prelude : FxHashSet < Name > ,
13631364
13641365 /// n.b. This is used only for better diagnostics, not name resolution itself.
13651366 has_self : FxHashSet < DefId > ,
@@ -1676,6 +1677,17 @@ impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> {
16761677 DefCollector :: new ( & mut definitions, Mark :: root ( ) )
16771678 . collect_root ( crate_name, session. local_crate_disambiguator ( ) ) ;
16781679
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+
16791691 let mut invocations = FxHashMap ( ) ;
16801692 invocations. insert ( Mark :: root ( ) ,
16811693 arenas. alloc_invocation_data ( InvocationData :: root ( graph_root) ) ) ;
@@ -1694,6 +1706,7 @@ impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> {
16941706 // AST.
16951707 graph_root,
16961708 prelude : None ,
1709+ extern_prelude,
16971710
16981711 has_self : FxHashSet ( ) ,
16991712 field_names : FxHashMap ( ) ,
@@ -1966,7 +1979,7 @@ impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> {
19661979
19671980 if !module. no_implicit_prelude {
19681981 // `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 ) {
19701983 let crate_id = self . crate_loader . process_path_extern ( ident. name , ident. span ) ;
19711984 let crate_root = self . get_module ( DefId { krate : crate_id, index : CRATE_DEF_INDEX } ) ;
19721985 self . populate_module_if_necessary ( & crate_root) ;
@@ -4018,7 +4031,7 @@ impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> {
40184031 } else {
40194032 // Items from the prelude
40204033 if !module. no_implicit_prelude {
4021- names. extend ( self . session . extern_prelude . iter ( ) . cloned ( ) ) ;
4034+ names. extend ( self . extern_prelude . iter ( ) . cloned ( ) ) ;
40224035 if let Some ( prelude) = self . prelude {
40234036 add_module_candidates ( prelude, & mut names) ;
40244037 }
@@ -4464,7 +4477,8 @@ impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> {
44644477 ) ;
44654478
44664479 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 ( ) {
44684482 let ident = Ident :: with_empty_ctxt ( name) ;
44694483 match self . crate_loader . maybe_process_path_extern ( name, ident. span ) {
44704484 Some ( crate_id) => {
0 commit comments