@@ -11,10 +11,13 @@ use std::fmt;
1111
1212use rustc_ast:: visit:: walk_list;
1313use rustc_data_structures:: fx:: { FxHashSet , FxIndexMap , FxIndexSet } ;
14+ use rustc_data_structures:: sorted_map:: SortedMap ;
1415use rustc_hir as hir;
1516use rustc_hir:: def:: { DefKind , Res } ;
1617use rustc_hir:: intravisit:: { self , Visitor } ;
17- use rustc_hir:: { GenericArg , GenericParam , GenericParamKind , HirId , HirIdMap , LifetimeName , Node } ;
18+ use rustc_hir:: {
19+ GenericArg , GenericParam , GenericParamKind , HirId , ItemLocalMap , LifetimeName , Node ,
20+ } ;
1821use rustc_macros:: extension;
1922use rustc_middle:: hir:: nested_filter;
2023use rustc_middle:: middle:: resolve_bound_vars:: * ;
@@ -73,15 +76,15 @@ impl ResolvedArg {
7376struct NamedVarMap {
7477 // maps from every use of a named (not anonymous) bound var to a
7578 // `ResolvedArg` describing how that variable is bound
76- defs : HirIdMap < ResolvedArg > ,
79+ defs : ItemLocalMap < ResolvedArg > ,
7780
7881 // Maps relevant hir items to the bound vars on them. These include:
7982 // - function defs
8083 // - function pointers
8184 // - closures
8285 // - trait refs
8386 // - bound types (like `T` in `for<'a> T<'a>: Foo`)
84- late_bound_vars : HirIdMap < Vec < ty:: BoundVariableKind > > ,
87+ late_bound_vars : ItemLocalMap < Vec < ty:: BoundVariableKind > > ,
8588}
8689
8790struct BoundVarContext < ' a , ' tcx > {
@@ -224,10 +227,10 @@ pub(crate) fn provide(providers: &mut Providers) {
224227 * providers = Providers {
225228 resolve_bound_vars,
226229
227- named_variable_map : |tcx, id| tcx. resolve_bound_vars ( id) . defs . get ( & id ) ,
230+ named_variable_map : |tcx, id| & tcx. resolve_bound_vars ( id) . defs ,
228231 is_late_bound_map,
229232 object_lifetime_default,
230- late_bound_vars_map : |tcx, id| tcx. resolve_bound_vars ( id) . late_bound_vars . get ( & id ) ,
233+ late_bound_vars_map : |tcx, id| & tcx. resolve_bound_vars ( id) . late_bound_vars ,
231234
232235 ..* providers
233236 } ;
@@ -264,16 +267,12 @@ fn resolve_bound_vars(tcx: TyCtxt<'_>, local_def_id: hir::OwnerId) -> ResolveBou
264267 hir:: OwnerNode :: Synthetic => unreachable ! ( ) ,
265268 }
266269
267- let mut rl = ResolveBoundVars :: default ( ) ;
268-
269- for ( hir_id, v) in named_variable_map. defs {
270- let map = rl. defs . entry ( hir_id. owner ) . or_default ( ) ;
271- map. insert ( hir_id. local_id , v) ;
272- }
273- for ( hir_id, v) in named_variable_map. late_bound_vars {
274- let map = rl. late_bound_vars . entry ( hir_id. owner ) . or_default ( ) ;
275- map. insert ( hir_id. local_id , v) ;
276- }
270+ let defs = named_variable_map. defs . into_sorted_stable_ord ( ) ;
271+ let late_bound_vars = named_variable_map. late_bound_vars . into_sorted_stable_ord ( ) ;
272+ let rl = ResolveBoundVars {
273+ defs : SortedMap :: from_presorted_elements ( defs) ,
274+ late_bound_vars : SortedMap :: from_presorted_elements ( late_bound_vars) ,
275+ } ;
277276
278277 debug ! ( ?rl. defs) ;
279278 debug ! ( ?rl. late_bound_vars) ;
@@ -339,7 +338,7 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
339338 Scope :: Binder { hir_id, .. } => {
340339 // Nested poly trait refs have the binders concatenated
341340 let mut full_binders =
342- self . map . late_bound_vars . entry ( * hir_id) . or_default ( ) . clone ( ) ;
341+ self . map . late_bound_vars . entry ( hir_id. local_id ) . or_default ( ) . clone ( ) ;
343342 full_binders. extend ( supertrait_bound_vars) ;
344343 break ( full_binders, BinderScopeType :: Concatenating ) ;
345344 }
@@ -678,7 +677,7 @@ impl<'a, 'tcx> Visitor<'tcx> for BoundVarContext<'a, 'tcx> {
678677 hir:: TyKind :: Ref ( lifetime_ref, ref mt) => {
679678 self . visit_lifetime ( lifetime_ref) ;
680679 let scope = Scope :: ObjectLifetimeDefault {
681- lifetime : self . map . defs . get ( & lifetime_ref. hir_id ) . cloned ( ) ,
680+ lifetime : self . map . defs . get ( & lifetime_ref. hir_id . local_id ) . cloned ( ) ,
682681 s : self . scope ,
683682 } ;
684683 self . with ( scope, |this| this. visit_ty ( mt. ty ) ) ;
@@ -705,7 +704,7 @@ impl<'a, 'tcx> Visitor<'tcx> for BoundVarContext<'a, 'tcx> {
705704 // and ban them. Type variables instantiated inside binders aren't
706705 // well-supported at the moment, so this doesn't work.
707706 // In the future, this should be fixed and this error should be removed.
708- let def = self . map . defs . get ( & lifetime. hir_id ) . copied ( ) ;
707+ let def = self . map . defs . get ( & lifetime. hir_id . local_id ) . copied ( ) ;
709708 let Some ( ResolvedArg :: LateBound ( _, _, lifetime_def_id) ) = def else { continue } ;
710709 let lifetime_hir_id = self . tcx . local_def_id_to_hir_id ( lifetime_def_id) ;
711710
@@ -842,7 +841,7 @@ impl<'a, 'tcx> Visitor<'tcx> for BoundVarContext<'a, 'tcx> {
842841 let bound_vars: Vec < _ > =
843842 self . tcx . fn_sig ( sig_id) . skip_binder ( ) . bound_vars ( ) . iter ( ) . collect ( ) ;
844843 let hir_id = self . tcx . local_def_id_to_hir_id ( def_id) ;
845- self . map . late_bound_vars . insert ( hir_id, bound_vars) ;
844+ self . map . late_bound_vars . insert ( hir_id. local_id , bound_vars) ;
846845 }
847846 self . visit_fn_like_elision ( fd. inputs , output, matches ! ( fk, intravisit:: FnKind :: Closure ) ) ;
848847 intravisit:: walk_fn_kind ( self , fk) ;
@@ -1015,10 +1014,10 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
10151014 }
10161015
10171016 fn record_late_bound_vars ( & mut self , hir_id : HirId , binder : Vec < ty:: BoundVariableKind > ) {
1018- if let Some ( old) = self . map . late_bound_vars . insert ( hir_id, binder) {
1017+ if let Some ( old) = self . map . late_bound_vars . insert ( hir_id. local_id , binder) {
10191018 bug ! (
10201019 "overwrote bound vars for {hir_id:?}:\n old={old:?}\n new={:?}" ,
1021- self . map. late_bound_vars[ & hir_id]
1020+ self . map. late_bound_vars[ & hir_id. local_id ]
10221021 )
10231022 }
10241023 }
@@ -1393,9 +1392,9 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
13931392 kind. descr( param_def_id. to_def_id( ) )
13941393 ) ,
13951394 } ;
1396- self . map . defs . insert ( hir_id, ResolvedArg :: Error ( guar) ) ;
1395+ self . map . defs . insert ( hir_id. local_id , ResolvedArg :: Error ( guar) ) ;
13971396 } else {
1398- self . map . defs . insert ( hir_id, def) ;
1397+ self . map . defs . insert ( hir_id. local_id , def) ;
13991398 }
14001399 return ;
14011400 }
@@ -1428,7 +1427,7 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
14281427 bug ! ( "unexpected def-kind: {}" , kind. descr( param_def_id. to_def_id( ) ) )
14291428 }
14301429 } ) ;
1431- self . map . defs . insert ( hir_id, ResolvedArg :: Error ( guar) ) ;
1430+ self . map . defs . insert ( hir_id. local_id , ResolvedArg :: Error ( guar) ) ;
14321431 return ;
14331432 }
14341433 Scope :: Root { .. } => break ,
@@ -1538,7 +1537,7 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
15381537 // This index can be used with `generic_args` since `parent_count == 0`.
15391538 let index = generics. param_def_id_to_index [ & param_def_id] as usize ;
15401539 generic_args. args . get ( index) . and_then ( |arg| match arg {
1541- GenericArg :: Lifetime ( lt) => map. defs . get ( & lt. hir_id ) . copied ( ) ,
1540+ GenericArg :: Lifetime ( lt) => map. defs . get ( & lt. hir_id . local_id ) . copied ( ) ,
15421541 _ => None ,
15431542 } )
15441543 }
@@ -1828,7 +1827,7 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
18281827 #[ instrument( level = "debug" , skip( self ) ) ]
18291828 fn insert_lifetime ( & mut self , lifetime_ref : & ' tcx hir:: Lifetime , def : ResolvedArg ) {
18301829 debug ! ( span = ?lifetime_ref. ident. span) ;
1831- self . map . defs . insert ( lifetime_ref. hir_id , def) ;
1830+ self . map . defs . insert ( lifetime_ref. hir_id . local_id , def) ;
18321831 }
18331832
18341833 /// Sometimes we resolve a lifetime, but later find that it is an
@@ -1839,8 +1838,7 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
18391838 lifetime_ref : & ' tcx hir:: Lifetime ,
18401839 bad_def : ResolvedArg ,
18411840 ) {
1842- // FIXME(#120456) - is `swap_remove` correct?
1843- let old_value = self . map . defs . swap_remove ( & lifetime_ref. hir_id ) ;
1841+ let old_value = self . map . defs . remove ( & lifetime_ref. hir_id . local_id ) ;
18441842 assert_eq ! ( old_value, Some ( bad_def) ) ;
18451843 }
18461844}
0 commit comments