@@ -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:: * ;
@@ -74,15 +77,15 @@ impl ResolvedArg {
7477struct NamedVarMap {
7578// maps from every use of a named (not anonymous) bound var to a
7679// `ResolvedArg` describing how that variable is bound
77- defs : HirIdMap < ResolvedArg > ,
80+ defs : ItemLocalMap < ResolvedArg > ,
7881
7982// Maps relevant hir items to the bound vars on them. These include:
8083// - function defs
8184// - function pointers
8285// - closures
8386// - trait refs
8487// - bound types (like `T` in `for<'a> T<'a>: Foo`)
85- late_bound_vars : HirIdMap < Vec < ty:: BoundVariableKind > > ,
88+ late_bound_vars : ItemLocalMap < Vec < ty:: BoundVariableKind > > ,
8689}
8790
8891struct BoundVarContext < ' a , ' tcx > {
@@ -225,10 +228,10 @@ pub(crate) fn provide(providers: &mut Providers) {
225228* providers = Providers {
226229 resolve_bound_vars,
227230
228- named_variable_map : |tcx, id| tcx. resolve_bound_vars ( id) . defs . get ( & id ) ,
231+ named_variable_map : |tcx, id| & tcx. resolve_bound_vars ( id) . defs ,
229232 is_late_bound_map,
230233 object_lifetime_default,
231- late_bound_vars_map : |tcx, id| tcx. resolve_bound_vars ( id) . late_bound_vars . get ( & id ) ,
234+ late_bound_vars_map : |tcx, id| & tcx. resolve_bound_vars ( id) . late_bound_vars ,
232235
233236 ..* providers
234237} ;
@@ -265,16 +268,12 @@ fn resolve_bound_vars(tcx: TyCtxt<'_>, local_def_id: hir::OwnerId) -> ResolveBou
265268 hir:: OwnerNode :: Synthetic => unreachable ! ( ) ,
266269}
267270
268- let mut rl = ResolveBoundVars :: default ( ) ;
269-
270- for ( hir_id, v) in named_variable_map. defs {
271- let map = rl. defs . entry ( hir_id. owner ) . or_default ( ) ;
272- map. insert ( hir_id. local_id , v) ;
273- }
274- for ( hir_id, v) in named_variable_map. late_bound_vars {
275- let map = rl. late_bound_vars . entry ( hir_id. owner ) . or_default ( ) ;
276- map. insert ( hir_id. local_id , v) ;
277- }
271+ let defs = named_variable_map. defs . into_sorted_stable_ord ( ) ;
272+ let late_bound_vars = named_variable_map. late_bound_vars . into_sorted_stable_ord ( ) ;
273+ let rl = ResolveBoundVars {
274+ defs : SortedMap :: from_presorted_elements ( defs) ,
275+ late_bound_vars : SortedMap :: from_presorted_elements ( late_bound_vars) ,
276+ } ;
278277
279278debug ! ( ?rl. defs) ;
280279debug ! ( ?rl. late_bound_vars) ;
@@ -340,7 +339,7 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
340339Scope :: Binder { hir_id, .. } => {
341340// Nested poly trait refs have the binders concatenated
342341let mut full_binders =
343- self . map . late_bound_vars . entry ( * hir_id) . or_default ( ) . clone ( ) ;
342+ self . map . late_bound_vars . entry ( hir_id. local_id ) . or_default ( ) . clone ( ) ;
344343 full_binders. extend ( supertrait_bound_vars) ;
345344break ( full_binders, BinderScopeType :: Concatenating ) ;
346345}
@@ -677,7 +676,7 @@ impl<'a, 'tcx> Visitor<'tcx> for BoundVarContext<'a, 'tcx> {
677676 hir:: TyKind :: Ref ( lifetime_ref, ref mt) => {
678677self . visit_lifetime ( lifetime_ref) ;
679678let scope = Scope :: ObjectLifetimeDefault {
680- lifetime : self . map . defs . get ( & lifetime_ref. hir_id ) . cloned ( ) ,
679+ lifetime : self . map . defs . get ( & lifetime_ref. hir_id . local_id ) . cloned ( ) ,
681680s : self . scope ,
682681} ;
683682self . with ( scope, |this| this. visit_ty ( mt. ty ) ) ;
@@ -704,7 +703,7 @@ impl<'a, 'tcx> Visitor<'tcx> for BoundVarContext<'a, 'tcx> {
704703// and ban them. Type variables instantiated inside binders aren't
705704// well-supported at the moment, so this doesn't work.
706705// In the future, this should be fixed and this error should be removed.
707- let def = self . map . defs . get ( & lifetime. hir_id ) . copied ( ) ;
706+ let def = self . map . defs . get ( & lifetime. hir_id . local_id ) . copied ( ) ;
708707let Some ( ResolvedArg :: LateBound ( _, _, lifetime_def_id) ) = def else { continue } ;
709708let lifetime_hir_id = self . tcx . local_def_id_to_hir_id ( lifetime_def_id) ;
710709
@@ -841,7 +840,7 @@ impl<'a, 'tcx> Visitor<'tcx> for BoundVarContext<'a, 'tcx> {
841840let bound_vars: Vec < _ > =
842841self . tcx . fn_sig ( sig_id) . skip_binder ( ) . bound_vars ( ) . iter ( ) . collect ( ) ;
843842let hir_id = self . tcx . local_def_id_to_hir_id ( def_id) ;
844- self . map . late_bound_vars . insert ( hir_id, bound_vars) ;
843+ self . map . late_bound_vars . insert ( hir_id. local_id , bound_vars) ;
845844}
846845self . visit_fn_like_elision ( fd. inputs , output, matches ! ( fk, intravisit:: FnKind :: Closure ) ) ;
847846 intravisit:: walk_fn_kind ( self , fk) ;
@@ -1019,10 +1018,10 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
10191018}
10201019
10211020fn record_late_bound_vars ( & mut self , hir_id : HirId , binder : Vec < ty:: BoundVariableKind > ) {
1022- if let Some ( old) = self . map . late_bound_vars . insert ( hir_id, binder) {
1021+ if let Some ( old) = self . map . late_bound_vars . insert ( hir_id. local_id , binder) {
10231022bug ! (
10241023"overwrote bound vars for {hir_id:?}:\n old={old:?}\n new={:?}" ,
1025- self . map. late_bound_vars[ & hir_id]
1024+ self . map. late_bound_vars[ & hir_id. local_id ]
10261025)
10271026}
10281027}
@@ -1381,9 +1380,9 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
13811380 kind. descr( param_def_id. to_def_id( ) )
13821381) ,
13831382} ;
1384- self . map . defs . insert ( hir_id, ResolvedArg :: Error ( guar) ) ;
1383+ self . map . defs . insert ( hir_id. local_id , ResolvedArg :: Error ( guar) ) ;
13851384} else {
1386- self . map . defs . insert ( hir_id, def) ;
1385+ self . map . defs . insert ( hir_id. local_id , def) ;
13871386}
13881387return ;
13891388}
@@ -1416,7 +1415,7 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
14161415bug ! ( "unexpected def-kind: {}" , kind. descr( param_def_id. to_def_id( ) ) )
14171416}
14181417} ) ;
1419- self . map . defs . insert ( hir_id, ResolvedArg :: Error ( guar) ) ;
1418+ self . map . defs . insert ( hir_id. local_id , ResolvedArg :: Error ( guar) ) ;
14201419return ;
14211420}
14221421Scope :: Root { .. } => break ,
@@ -1526,7 +1525,7 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
15261525// This index can be used with `generic_args` since `parent_count == 0`.
15271526let index = generics. param_def_id_to_index [ & param_def_id] as usize ;
15281527 generic_args. args . get ( index) . and_then ( |arg| match arg {
1529- GenericArg :: Lifetime ( lt) => map. defs . get ( & lt. hir_id ) . copied ( ) ,
1528+ GenericArg :: Lifetime ( lt) => map. defs . get ( & lt. hir_id . local_id ) . copied ( ) ,
15301529 _ => None ,
15311530} )
15321531}
@@ -1816,7 +1815,7 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
18161815#[ instrument( level = "debug" , skip( self ) ) ]
18171816fn insert_lifetime ( & mut self , lifetime_ref : & ' tcx hir:: Lifetime , def : ResolvedArg ) {
18181817debug ! ( span = ?lifetime_ref. ident. span) ;
1819- self . map . defs . insert ( lifetime_ref. hir_id , def) ;
1818+ self . map . defs . insert ( lifetime_ref. hir_id . local_id , def) ;
18201819}
18211820
18221821/// Sometimes we resolve a lifetime, but later find that it is an
@@ -1827,8 +1826,7 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
18271826lifetime_ref : & ' tcx hir:: Lifetime ,
18281827bad_def : ResolvedArg ,
18291828) {
1830- // FIXME(#120456) - is `swap_remove` correct?
1831- let old_value = self . map . defs . swap_remove ( & lifetime_ref. hir_id ) ;
1829+ let old_value = self . map . defs . remove ( & lifetime_ref. hir_id . local_id ) ;
18321830assert_eq ! ( old_value, Some ( bad_def) ) ;
18331831}
18341832
@@ -1998,7 +1996,7 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
19981996// See where these vars are used in `HirTyLowerer::lower_ty_maybe_return_type_notation`.
19991997// And this is exercised in:
20001998// `tests/ui/associated-type-bounds/return-type-notation/higher-ranked-bound-works.rs`.
2001- let existing_bound_vars = self . map . late_bound_vars . get_mut ( & hir_id) . unwrap ( ) ;
1999+ let existing_bound_vars = self . map . late_bound_vars . get_mut ( & hir_id. local_id ) . unwrap ( ) ;
20022000let existing_bound_vars_saved = existing_bound_vars. clone ( ) ;
20032001 existing_bound_vars. extend ( bound_vars) ;
20042002self . record_late_bound_vars ( item_segment. hir_id , existing_bound_vars_saved) ;
0 commit comments