@@ -1011,9 +1011,9 @@ impl<'ra> NameBindingData<'ra> {
1011
1011
enum EpeBinding < ' ra > {
1012
1012
#[ default]
1013
1013
OptPending ,
1014
- OptReadyOk ( NameBinding < ' ra > ) ,
1015
- OptReadyErr ,
1016
- Item ( NameBinding < ' ra > ) ,
1014
+ OptReadyOk ( NameBinding < ' ra > , bool ) ,
1015
+ OptReadyErr ( bool ) ,
1016
+ Item ( NameBinding < ' ra > , bool ) ,
1017
1017
}
1018
1018
1019
1019
#[ derive( Default , Clone ) ]
@@ -2021,7 +2021,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
2021
2021
if used == Used :: Scope {
2022
2022
if let Some ( entry) = self . extern_prelude . get ( & ident. normalize_to_macros_2_0 ( ) ) {
2023
2023
if !entry. introduced_by_item
2024
- && entry. binding . get ( ) == EpeBinding :: Item ( used_binding)
2024
+ && matches ! ( entry. binding. get( ) , EpeBinding :: Item ( b , _ ) if b == used_binding)
2025
2025
{
2026
2026
return ;
2027
2027
}
@@ -2187,23 +2187,23 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
2187
2187
let norm_ident = ident. normalize_to_macros_2_0 ( ) ;
2188
2188
let entry = self . extern_prelude . get ( & norm_ident) . cloned ( ) ;
2189
2189
let binding = entry. map ( |entry| match entry. binding . get ( ) {
2190
- EpeBinding :: Item ( binding) => {
2191
- if finalize && entry. introduced_by_item {
2190
+ EpeBinding :: Item ( binding, finalized ) => {
2191
+ if finalize && !finalized && entry. introduced_by_item {
2192
2192
self . record_use ( ident, binding, Used :: Other ) ;
2193
2193
}
2194
- EpeBinding :: Item ( binding)
2194
+ EpeBinding :: Item ( binding, finalize )
2195
2195
}
2196
- EpeBinding :: OptReadyOk ( binding) => {
2197
- if finalize {
2196
+ EpeBinding :: OptReadyOk ( binding, finalized ) => {
2197
+ if finalize && !finalized {
2198
2198
self . cstore_mut ( ) . process_path_extern ( self . tcx , ident. name , ident. span ) ;
2199
2199
}
2200
- EpeBinding :: OptReadyOk ( binding)
2200
+ EpeBinding :: OptReadyOk ( binding, finalize )
2201
2201
}
2202
- EpeBinding :: OptReadyErr => {
2203
- if finalize {
2202
+ EpeBinding :: OptReadyErr ( finalized ) => {
2203
+ if finalize && !finalized {
2204
2204
self . cstore_mut ( ) . process_path_extern ( self . tcx , ident. name , ident. span ) ;
2205
2205
}
2206
- EpeBinding :: OptReadyErr
2206
+ EpeBinding :: OptReadyErr ( finalize )
2207
2207
}
2208
2208
EpeBinding :: OptPending => {
2209
2209
let crate_id = if finalize {
@@ -2213,19 +2213,19 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
2213
2213
} ;
2214
2214
let res = match crate_id {
2215
2215
Some ( crate_id) => Res :: Def ( DefKind :: Mod , crate_id. as_def_id ( ) ) ,
2216
- None => return EpeBinding :: OptReadyErr ,
2216
+ None => return EpeBinding :: OptReadyErr ( finalize ) ,
2217
2217
} ;
2218
2218
let binding = self . arenas . new_pub_res_binding ( res, DUMMY_SP , LocalExpnId :: ROOT ) ;
2219
- EpeBinding :: OptReadyOk ( binding)
2219
+ EpeBinding :: OptReadyOk ( binding, finalize )
2220
2220
}
2221
2221
} ) ;
2222
2222
2223
2223
binding. and_then ( |binding| {
2224
2224
self . extern_prelude [ & norm_ident] . binding . set ( binding) ;
2225
2225
match binding {
2226
- EpeBinding :: Item ( binding) | EpeBinding :: OptReadyOk ( binding) => Some ( binding) ,
2227
- EpeBinding :: OptReadyErr if finalize => Some ( self . dummy_binding ) ,
2228
- EpeBinding :: OptReadyErr => None ,
2226
+ EpeBinding :: Item ( binding, _ ) | EpeBinding :: OptReadyOk ( binding, _ ) => Some ( binding) ,
2227
+ EpeBinding :: OptReadyErr ( _ ) if finalize => Some ( self . dummy_binding ) ,
2228
+ EpeBinding :: OptReadyErr ( _ ) => None ,
2229
2229
EpeBinding :: OptPending => unreachable ! ( ) ,
2230
2230
}
2231
2231
} )
0 commit comments