@@ -102,6 +102,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
102
102
ScopeSet :: All ( ns)
103
103
| ScopeSet :: ModuleAndExternPrelude ( ns, _)
104
104
| ScopeSet :: Late ( ns, ..) => ( ns, None ) ,
105
+ ScopeSet :: ExternPrelude => ( TypeNS , None ) ,
105
106
ScopeSet :: Macro ( macro_kind) => ( MacroNS , Some ( macro_kind) ) ,
106
107
} ;
107
108
let module = match scope_set {
@@ -111,8 +112,10 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
111
112
_ => parent_scope. module . nearest_item_scope ( ) ,
112
113
} ;
113
114
let module_and_extern_prelude = matches ! ( scope_set, ScopeSet :: ModuleAndExternPrelude ( ..) ) ;
115
+ let extern_prelude = matches ! ( scope_set, ScopeSet :: ExternPrelude ) ;
114
116
let mut scope = match ns {
115
117
_ if module_and_extern_prelude => Scope :: Module ( module, None ) ,
118
+ _ if extern_prelude => Scope :: ExternPreludeItems ,
116
119
TypeNS | ValueNS => Scope :: Module ( module, None ) ,
117
120
MacroNS => Scope :: DeriveHelpers ( parent_scope. expansion ) ,
118
121
} ;
@@ -143,7 +146,9 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
143
146
Scope :: Module ( ..) => true ,
144
147
Scope :: MacroUsePrelude => use_prelude || rust_2015,
145
148
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
+ }
147
152
Scope :: ToolPrelude => use_prelude,
148
153
Scope :: StdLibPrelude => use_prelude || ns == MacroNS ,
149
154
Scope :: BuiltinTypes => true ,
@@ -182,7 +187,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
182
187
Scope :: Module ( ..) if module_and_extern_prelude => match ns {
183
188
TypeNS => {
184
189
ctxt. adjust ( ExpnId :: root ( ) ) ;
185
- Scope :: ExternPrelude
190
+ Scope :: ExternPreludeItems
186
191
}
187
192
ValueNS | MacroNS => break ,
188
193
} ,
@@ -199,7 +204,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
199
204
None => {
200
205
ctxt. adjust ( ExpnId :: root ( ) ) ;
201
206
match ns {
202
- TypeNS => Scope :: ExternPrelude ,
207
+ TypeNS => Scope :: ExternPreludeItems ,
203
208
ValueNS => Scope :: StdLibPrelude ,
204
209
MacroNS => Scope :: MacroUsePrelude ,
205
210
}
@@ -208,8 +213,9 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
208
213
}
209
214
Scope :: MacroUsePrelude => Scope :: StdLibPrelude ,
210
215
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 ,
213
219
Scope :: ToolPrelude => Scope :: StdLibPrelude ,
214
220
Scope :: StdLibPrelude => match ns {
215
221
TypeNS => Scope :: BuiltinTypes ,
@@ -413,6 +419,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
413
419
ScopeSet :: All ( ns)
414
420
| ScopeSet :: ModuleAndExternPrelude ( ns, _)
415
421
| ScopeSet :: Late ( ns, ..) => ( ns, None ) ,
422
+ ScopeSet :: ExternPrelude => ( TypeNS , None ) ,
416
423
ScopeSet :: Macro ( macro_kind) => ( MacroNS , Some ( macro_kind) ) ,
417
424
} ;
418
425
@@ -429,6 +436,10 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
429
436
// to detect potential ambiguities.
430
437
let mut innermost_result: Option < ( NameBinding < ' _ > , Flags ) > = None ;
431
438
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
+ }
432
443
433
444
// Go through all the scopes and try to resolve the name.
434
445
let break_result = self . visit_scopes (
@@ -494,7 +505,8 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
494
505
_ => Err ( Determinacy :: Determined ) ,
495
506
} ,
496
507
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) =
498
510
if matches ! ( scope_set, ScopeSet :: ModuleAndExternPrelude ( ..) ) {
499
511
( parent_scope, finalize)
500
512
} else {
@@ -513,7 +525,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
513
525
} else {
514
526
Shadowing :: Restricted
515
527
} ,
516
- finalize ,
528
+ adjusted_finalize ,
517
529
ignore_binding,
518
530
ignore_import,
519
531
) ;
@@ -561,14 +573,21 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
561
573
Some ( binding) => Ok ( ( * binding, Flags :: empty ( ) ) ) ,
562
574
None => Err ( Determinacy :: Determined ) ,
563
575
} ,
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 ( ) ) {
566
579
Some ( binding) => Ok ( ( binding, Flags :: empty ( ) ) ) ,
567
580
None => Err ( Determinacy :: determined (
568
581
this. graph_root . unexpanded_invocations . borrow ( ) . is_empty ( ) ,
569
582
) ) ,
570
583
}
571
584
}
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
+ }
572
591
Scope :: ToolPrelude => match this. registered_tool_bindings . get ( & ident) {
573
592
Some ( binding) => Ok ( ( * binding, Flags :: empty ( ) ) ) ,
574
593
None => Err ( Determinacy :: Determined ) ,
@@ -599,8 +618,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
599
618
if matches ! ( ident. name, sym:: f16)
600
619
&& !this. tcx . features ( ) . f16 ( )
601
620
&& !ident. span . allows_unstable ( sym:: f16)
602
- && finalize. is_some ( )
603
- && innermost_result. is_none ( )
621
+ && finalize_scope ! ( ) . is_some ( )
604
622
{
605
623
feature_err (
606
624
this. tcx . sess ,
@@ -613,8 +631,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
613
631
if matches ! ( ident. name, sym:: f128)
614
632
&& !this. tcx . features ( ) . f128 ( )
615
633
&& !ident. span . allows_unstable ( sym:: f128)
616
- && finalize. is_some ( )
617
- && innermost_result. is_none ( )
634
+ && finalize_scope ! ( ) . is_some ( )
618
635
{
619
636
feature_err (
620
637
this. tcx . sess ,
@@ -819,15 +836,17 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
819
836
assert_eq ! ( shadowing, Shadowing :: Unrestricted ) ;
820
837
return if ns != TypeNS {
821
838
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 ) )
829
839
} 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 ) ) ;
831
850
} ;
832
851
}
833
852
ModuleOrUniformRoot :: CurrentScope => {
0 commit comments