@@ -102,6 +102,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
102102 ScopeSet :: All ( ns)
103103 | ScopeSet :: ModuleAndExternPrelude ( ns, _)
104104 | ScopeSet :: Late ( ns, ..) => ( ns, None ) ,
105+ ScopeSet :: ExternPrelude => ( TypeNS , None ) ,
105106 ScopeSet :: Macro ( macro_kind) => ( MacroNS , Some ( macro_kind) ) ,
106107 } ;
107108 let module = match scope_set {
@@ -111,8 +112,10 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
111112 _ => parent_scope. module . nearest_item_scope ( ) ,
112113 } ;
113114 let module_and_extern_prelude = matches ! ( scope_set, ScopeSet :: ModuleAndExternPrelude ( ..) ) ;
115+ let extern_prelude = matches ! ( scope_set, ScopeSet :: ExternPrelude ) ;
114116 let mut scope = match ns {
115117 _ if module_and_extern_prelude => Scope :: Module ( module, None ) ,
118+ _ if extern_prelude => Scope :: ExternPreludeItems ,
116119 TypeNS | ValueNS => Scope :: Module ( module, None ) ,
117120 MacroNS => Scope :: DeriveHelpers ( parent_scope. expansion ) ,
118121 } ;
@@ -143,7 +146,9 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
143146 Scope :: Module ( ..) => true ,
144147 Scope :: MacroUsePrelude => use_prelude || rust_2015,
145148 Scope :: BuiltinAttrs => true ,
146- Scope :: ExternPrelude => use_prelude || module_and_extern_prelude,
149+ Scope :: ExternPreludeItems | Scope :: ExternPreludeFlags => {
150+ use_prelude || module_and_extern_prelude || extern_prelude
151+ }
147152 Scope :: ToolPrelude => use_prelude,
148153 Scope :: StdLibPrelude => use_prelude || ns == MacroNS ,
149154 Scope :: BuiltinTypes => true ,
@@ -182,7 +187,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
182187 Scope :: Module ( ..) if module_and_extern_prelude => match ns {
183188 TypeNS => {
184189 ctxt. adjust ( ExpnId :: root ( ) ) ;
185- Scope :: ExternPrelude
190+ Scope :: ExternPreludeItems
186191 }
187192 ValueNS | MacroNS => break ,
188193 } ,
@@ -199,7 +204,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
199204 None => {
200205 ctxt. adjust ( ExpnId :: root ( ) ) ;
201206 match ns {
202- TypeNS => Scope :: ExternPrelude ,
207+ TypeNS => Scope :: ExternPreludeItems ,
203208 ValueNS => Scope :: StdLibPrelude ,
204209 MacroNS => Scope :: MacroUsePrelude ,
205210 }
@@ -208,8 +213,9 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
208213 }
209214 Scope :: MacroUsePrelude => Scope :: StdLibPrelude ,
210215 Scope :: BuiltinAttrs => break , // nowhere else to search
211- Scope :: ExternPrelude if module_and_extern_prelude => break ,
212- Scope :: ExternPrelude => Scope :: ToolPrelude ,
216+ Scope :: ExternPreludeItems => Scope :: ExternPreludeFlags ,
217+ Scope :: ExternPreludeFlags if module_and_extern_prelude || extern_prelude => break ,
218+ Scope :: ExternPreludeFlags => Scope :: ToolPrelude ,
213219 Scope :: ToolPrelude => Scope :: StdLibPrelude ,
214220 Scope :: StdLibPrelude => match ns {
215221 TypeNS => Scope :: BuiltinTypes ,
@@ -413,6 +419,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
413419 ScopeSet :: All ( ns)
414420 | ScopeSet :: ModuleAndExternPrelude ( ns, _)
415421 | ScopeSet :: Late ( ns, ..) => ( ns, None ) ,
422+ ScopeSet :: ExternPrelude => ( TypeNS , None ) ,
416423 ScopeSet :: Macro ( macro_kind) => ( MacroNS , Some ( macro_kind) ) ,
417424 } ;
418425
@@ -429,6 +436,10 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
429436 // to detect potential ambiguities.
430437 let mut innermost_result: Option < ( NameBinding < ' _ > , Flags ) > = None ;
431438 let mut determinacy = Determinacy :: Determined ;
439+ // Shadowed bindings don't need to be marked as used or non-speculatively loaded.
440+ macro finalize_scope ( ) {
441+ if innermost_result. is_none ( ) { finalize } else { None }
442+ }
432443
433444 // Go through all the scopes and try to resolve the name.
434445 let break_result = self . visit_scopes (
@@ -494,7 +505,8 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
494505 _ => Err ( Determinacy :: Determined ) ,
495506 } ,
496507 Scope :: Module ( module, derive_fallback_lint_id) => {
497- let ( adjusted_parent_scope, finalize) =
508+ // FIXME: use `finalize_scope` here.
509+ let ( adjusted_parent_scope, adjusted_finalize) =
498510 if matches ! ( scope_set, ScopeSet :: ModuleAndExternPrelude ( ..) ) {
499511 ( parent_scope, finalize)
500512 } else {
@@ -513,7 +525,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
513525 } else {
514526 Shadowing :: Restricted
515527 } ,
516- finalize ,
528+ adjusted_finalize ,
517529 ignore_binding,
518530 ignore_import,
519531 ) ;
@@ -561,14 +573,21 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
561573 Some ( binding) => Ok ( ( * binding, Flags :: empty ( ) ) ) ,
562574 None => Err ( Determinacy :: Determined ) ,
563575 } ,
564- Scope :: ExternPrelude => {
565- match this. reborrow ( ) . extern_prelude_get ( ident, finalize. is_some ( ) ) {
576+ Scope :: ExternPreludeItems => {
577+ // FIXME: use `finalize_scope` here.
578+ match this. reborrow ( ) . extern_prelude_get_item ( ident, finalize. is_some ( ) ) {
566579 Some ( binding) => Ok ( ( binding, Flags :: empty ( ) ) ) ,
567580 None => Err ( Determinacy :: determined (
568581 this. graph_root . unexpanded_invocations . borrow ( ) . is_empty ( ) ,
569582 ) ) ,
570583 }
571584 }
585+ Scope :: ExternPreludeFlags => {
586+ match this. extern_prelude_get_flag ( ident, finalize_scope ! ( ) . is_some ( ) ) {
587+ Some ( binding) => Ok ( ( binding, Flags :: empty ( ) ) ) ,
588+ None => Err ( Determinacy :: Determined ) ,
589+ }
590+ }
572591 Scope :: ToolPrelude => match this. registered_tool_bindings . get ( & ident) {
573592 Some ( binding) => Ok ( ( * binding, Flags :: empty ( ) ) ) ,
574593 None => Err ( Determinacy :: Determined ) ,
@@ -599,8 +618,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
599618 if matches ! ( ident. name, sym:: f16)
600619 && !this. tcx . features ( ) . f16 ( )
601620 && !ident. span . allows_unstable ( sym:: f16)
602- && finalize. is_some ( )
603- && innermost_result. is_none ( )
621+ && finalize_scope ! ( ) . is_some ( )
604622 {
605623 feature_err (
606624 this. tcx . sess ,
@@ -613,8 +631,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
613631 if matches ! ( ident. name, sym:: f128)
614632 && !this. tcx . features ( ) . f128 ( )
615633 && !ident. span . allows_unstable ( sym:: f128)
616- && finalize. is_some ( )
617- && innermost_result. is_none ( )
634+ && finalize_scope ! ( ) . is_some ( )
618635 {
619636 feature_err (
620637 this. tcx . sess ,
@@ -819,15 +836,17 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
819836 assert_eq ! ( shadowing, Shadowing :: Unrestricted ) ;
820837 return if ns != TypeNS {
821838 Err ( ( Determined , Weak :: No ) )
822- } else if let Some ( binding) =
823- self . reborrow ( ) . extern_prelude_get ( ident, finalize. is_some ( ) )
824- {
825- Ok ( binding)
826- } else if !self . graph_root . unexpanded_invocations . borrow ( ) . is_empty ( ) {
827- // Macro-expanded `extern crate` items can add names to extern prelude.
828- Err ( ( Undetermined , Weak :: No ) )
829839 } else {
830- Err ( ( Determined , Weak :: No ) )
840+ let binding = self . early_resolve_ident_in_lexical_scope (
841+ ident,
842+ ScopeSet :: ExternPrelude ,
843+ parent_scope,
844+ finalize,
845+ finalize. is_some ( ) ,
846+ ignore_binding,
847+ ignore_import,
848+ ) ;
849+ return binding. map_err ( |determinacy| ( determinacy, Weak :: No ) ) ;
831850 } ;
832851 }
833852 ModuleOrUniformRoot :: CurrentScope => {
0 commit comments