@@ -97,6 +97,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
9797            ScopeSet :: All ( ns) 
9898            | ScopeSet :: ModuleAndExternPrelude ( ns,  _) 
9999            | ScopeSet :: Late ( ns,  ..)  => ( ns,  None ) , 
100+             ScopeSet :: ExternPrelude  => ( TypeNS ,  None ) , 
100101            ScopeSet :: Macro ( macro_kind)  => ( MacroNS ,  Some ( macro_kind) ) , 
101102        } ; 
102103        let  module = match  scope_set { 
@@ -106,8 +107,10 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
106107            _ => parent_scope. module . nearest_item_scope ( ) , 
107108        } ; 
108109        let  module_and_extern_prelude = matches ! ( scope_set,  ScopeSet :: ModuleAndExternPrelude ( ..) ) ; 
110+         let  extern_prelude = matches ! ( scope_set,  ScopeSet :: ExternPrelude ) ; 
109111        let  mut  scope = match  ns { 
110112            _ if  module_and_extern_prelude => Scope :: Module ( module,  None ) , 
113+             _ if  extern_prelude => Scope :: ExternPreludeItems , 
111114            TypeNS  | ValueNS  => Scope :: Module ( module,  None ) , 
112115            MacroNS  => Scope :: DeriveHelpers ( parent_scope. expansion ) , 
113116        } ; 
@@ -138,7 +141,9 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
138141                Scope :: Module ( ..)  => true , 
139142                Scope :: MacroUsePrelude  => use_prelude || rust_2015, 
140143                Scope :: BuiltinAttrs  => true , 
141-                 Scope :: ExternPrelude  => use_prelude || module_and_extern_prelude, 
144+                 Scope :: ExternPreludeItems  | Scope :: ExternPreludeFlags  => { 
145+                     use_prelude || module_and_extern_prelude || extern_prelude
146+                 } 
142147                Scope :: ToolPrelude  => use_prelude, 
143148                Scope :: StdLibPrelude  => use_prelude || ns == MacroNS , 
144149                Scope :: BuiltinTypes  => true , 
@@ -177,7 +182,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
177182                Scope :: Module ( ..)  if  module_and_extern_prelude => match  ns { 
178183                    TypeNS  => { 
179184                        ctxt. adjust ( ExpnId :: root ( ) ) ; 
180-                         Scope :: ExternPrelude 
185+                         Scope :: ExternPreludeItems 
181186                    } 
182187                    ValueNS  | MacroNS  => break , 
183188                } , 
@@ -194,7 +199,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
194199                        None  => { 
195200                            ctxt. adjust ( ExpnId :: root ( ) ) ; 
196201                            match  ns { 
197-                                 TypeNS  => Scope :: ExternPrelude , 
202+                                 TypeNS  => Scope :: ExternPreludeItems , 
198203                                ValueNS  => Scope :: StdLibPrelude , 
199204                                MacroNS  => Scope :: MacroUsePrelude , 
200205                            } 
@@ -203,8 +208,9 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
203208                } 
204209                Scope :: MacroUsePrelude  => Scope :: StdLibPrelude , 
205210                Scope :: BuiltinAttrs  => break ,  // nowhere else to search 
206-                 Scope :: ExternPrelude  if  module_and_extern_prelude => break , 
207-                 Scope :: ExternPrelude  => Scope :: ToolPrelude , 
211+                 Scope :: ExternPreludeItems  => Scope :: ExternPreludeFlags , 
212+                 Scope :: ExternPreludeFlags  if  module_and_extern_prelude || extern_prelude => break , 
213+                 Scope :: ExternPreludeFlags  => Scope :: ToolPrelude , 
208214                Scope :: ToolPrelude  => Scope :: StdLibPrelude , 
209215                Scope :: StdLibPrelude  => match  ns { 
210216                    TypeNS  => Scope :: BuiltinTypes , 
@@ -390,9 +396,10 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
390396            struct  Flags :  u8  { 
391397                const  MACRO_RULES           = 1  << 0 ; 
392398                const  MODULE                = 1  << 1 ; 
393-                 const  MISC_SUGGEST_CRATE    = 1  << 2 ; 
394-                 const  MISC_SUGGEST_SELF     = 1  << 3 ; 
395-                 const  MISC_FROM_PRELUDE     = 1  << 4 ; 
399+                 const  EXTERN_PRELUDE        = 1  << 2 ; 
400+                 const  MISC_SUGGEST_CRATE    = 1  << 3 ; 
401+                 const  MISC_SUGGEST_SELF     = 1  << 4 ; 
402+                 const  MISC_FROM_PRELUDE     = 1  << 5 ; 
396403            } 
397404        } 
398405
@@ -407,6 +414,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
407414            ScopeSet :: All ( ns) 
408415            | ScopeSet :: ModuleAndExternPrelude ( ns,  _) 
409416            | ScopeSet :: Late ( ns,  ..)  => ( ns,  None ) , 
417+             ScopeSet :: ExternPrelude  => ( TypeNS ,  None ) , 
410418            ScopeSet :: Macro ( macro_kind)  => ( MacroNS ,  Some ( macro_kind) ) , 
411419        } ; 
412420
@@ -555,14 +563,20 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
555563                        Some ( binding)  => Ok ( ( * binding,  Flags :: empty ( ) ) ) , 
556564                        None  => Err ( Determinacy :: Determined ) , 
557565                    } , 
558-                     Scope :: ExternPrelude  => { 
559-                         match  this. extern_prelude_get ( ident,  finalize. is_some ( ) )  { 
560-                             Some ( binding)  => Ok ( ( binding,  Flags :: empty ( ) ) ) , 
566+                     Scope :: ExternPreludeItems  => { 
567+                         match  this. extern_prelude_get_item ( ident,  finalize. is_some ( ) )  { 
568+                             Some ( binding)  => Ok ( ( binding,  Flags :: EXTERN_PRELUDE ) ) , 
561569                            None  => Err ( Determinacy :: determined ( 
562570                                this. graph_root . unexpanded_invocations . borrow ( ) . is_empty ( ) , 
563571                            ) ) , 
564572                        } 
565573                    } 
574+                     Scope :: ExternPreludeFlags  => { 
575+                         match  this. extern_prelude_get_flag ( ident,  finalize. is_some ( ) )  { 
576+                             Some ( binding)  => Ok ( ( binding,  Flags :: EXTERN_PRELUDE ) ) , 
577+                             None  => Err ( Determinacy :: Determined ) , 
578+                         } 
579+                     } 
566580                    Scope :: ToolPrelude  => match  this. registered_tool_bindings . get ( & ident)  { 
567581                        Some ( binding)  => Ok ( ( * binding,  Flags :: empty ( ) ) ) , 
568582                        None  => Err ( Determinacy :: Determined ) , 
@@ -671,7 +685,13 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
671685                                }  else  if  innermost_binding
672686                                    . may_appear_after ( parent_scope. expansion ,  binding) 
673687                                { 
674-                                     Some ( AmbiguityKind :: MoreExpandedVsOuter ) 
688+                                     if  flags. contains ( Flags :: EXTERN_PRELUDE ) 
689+                                         && innermost_flags. contains ( Flags :: EXTERN_PRELUDE ) 
690+                                     { 
691+                                         Some ( AmbiguityKind :: ExternPrelude ) 
692+                                     }  else  { 
693+                                         Some ( AmbiguityKind :: MoreExpandedVsOuter ) 
694+                                     } 
675695                                }  else  { 
676696                                    None 
677697                                } ; 
@@ -812,13 +832,17 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
812832                assert_eq ! ( shadowing,  Shadowing :: Unrestricted ) ; 
813833                return  if  ns != TypeNS  { 
814834                    Err ( ( Determined ,  Weak :: No ) ) 
815-                 }  else  if  let  Some ( binding)  = self . extern_prelude_get ( ident,  finalize. is_some ( ) )  { 
816-                     Ok ( binding) 
817-                 }  else  if  !self . graph_root . unexpanded_invocations . borrow ( ) . is_empty ( )  { 
818-                     // Macro-expanded `extern crate` items can add names to extern prelude. 
819-                     Err ( ( Undetermined ,  Weak :: No ) ) 
820835                }  else  { 
821-                     Err ( ( Determined ,  Weak :: No ) ) 
836+                     let  binding = self . early_resolve_ident_in_lexical_scope ( 
837+                         ident, 
838+                         ScopeSet :: ExternPrelude , 
839+                         parent_scope, 
840+                         finalize, 
841+                         finalize. is_some ( ) , 
842+                         ignore_binding, 
843+                         ignore_import, 
844+                     ) ; 
845+                     return  binding. map_err ( |determinacy| ( determinacy,  Weak :: No ) ) ; 
822846                } ; 
823847            } 
824848            ModuleOrUniformRoot :: CurrentScope  => { 
0 commit comments