@@ -17,8 +17,7 @@ use tracing::debug;
17
17
18
18
use crate :: infer:: InferCtxt ;
19
19
use crate :: infer:: canonical:: {
20
- Canonical , CanonicalQueryInput , CanonicalTyVarKind , CanonicalVarInfo , CanonicalVarKind ,
21
- OriginalQueryValues ,
20
+ Canonical , CanonicalQueryInput , CanonicalTyVarKind , CanonicalVarKind , OriginalQueryValues ,
22
21
} ;
23
22
24
23
impl < ' tcx > InferCtxt < ' tcx > {
@@ -175,7 +174,7 @@ impl CanonicalizeMode for CanonicalizeQueryResponse {
175
174
ty:: ReLateParam ( _) | ty:: ReErased | ty:: ReStatic | ty:: ReEarlyParam ( ..) => r,
176
175
177
176
ty:: RePlaceholder ( placeholder) => canonicalizer. canonical_var_for_region (
178
- CanonicalVarInfo { kind : CanonicalVarKind :: PlaceholderRegion ( placeholder) } ,
177
+ CanonicalVarKind :: PlaceholderRegion ( placeholder. universe ) ,
179
178
r,
180
179
) ,
181
180
@@ -186,10 +185,7 @@ impl CanonicalizeMode for CanonicalizeQueryResponse {
186
185
. unwrap_region_constraints ( )
187
186
. probe_value ( vid)
188
187
. unwrap_err ( ) ;
189
- canonicalizer. canonical_var_for_region (
190
- CanonicalVarInfo { kind : CanonicalVarKind :: Region ( universe) } ,
191
- r,
192
- )
188
+ canonicalizer. canonical_var_for_region ( CanonicalVarKind :: Region ( universe) , r)
193
189
}
194
190
195
191
_ => {
@@ -294,7 +290,7 @@ struct Canonicalizer<'cx, 'tcx> {
294
290
/// Set to `None` to disable the resolution of inference variables.
295
291
infcx : Option < & ' cx InferCtxt < ' tcx > > ,
296
292
tcx : TyCtxt < ' tcx > ,
297
- variables : SmallVec < [ CanonicalVarInfo < ' tcx > ; 8 ] > ,
293
+ variables : SmallVec < [ CanonicalVarKind ; 8 ] > ,
298
294
query_state : & ' cx mut OriginalQueryValues < ' tcx > ,
299
295
// Note that indices is only used once `var_values` is big enough to be
300
296
// heap-allocated.
@@ -368,9 +364,7 @@ impl<'cx, 'tcx> TypeFolder<TyCtxt<'tcx>> for Canonicalizer<'cx, 'tcx> {
368
364
ui = ty:: UniverseIndex :: ROOT ;
369
365
}
370
366
self . canonicalize_ty_var (
371
- CanonicalVarInfo {
372
- kind : CanonicalVarKind :: Ty ( CanonicalTyVarKind :: General ( ui) ) ,
373
- } ,
367
+ CanonicalVarKind :: Ty ( CanonicalTyVarKind :: General ( ui) ) ,
374
368
t,
375
369
)
376
370
}
@@ -382,36 +376,29 @@ impl<'cx, 'tcx> TypeFolder<TyCtxt<'tcx>> for Canonicalizer<'cx, 'tcx> {
382
376
if nt != t {
383
377
return self . fold_ty ( nt) ;
384
378
} else {
385
- self . canonicalize_ty_var (
386
- CanonicalVarInfo { kind : CanonicalVarKind :: Ty ( CanonicalTyVarKind :: Int ) } ,
387
- t,
388
- )
379
+ self . canonicalize_ty_var ( CanonicalVarKind :: Ty ( CanonicalTyVarKind :: Int ) , t)
389
380
}
390
381
}
391
382
ty:: Infer ( ty:: FloatVar ( vid) ) => {
392
383
let nt = self . infcx . unwrap ( ) . opportunistic_resolve_float_var ( vid) ;
393
384
if nt != t {
394
385
return self . fold_ty ( nt) ;
395
386
} else {
396
- self . canonicalize_ty_var (
397
- CanonicalVarInfo { kind : CanonicalVarKind :: Ty ( CanonicalTyVarKind :: Float ) } ,
398
- t,
399
- )
387
+ self . canonicalize_ty_var ( CanonicalVarKind :: Ty ( CanonicalTyVarKind :: Float ) , t)
400
388
}
401
389
}
402
390
403
391
ty:: Infer ( ty:: FreshTy ( _) | ty:: FreshIntTy ( _) | ty:: FreshFloatTy ( _) ) => {
404
392
bug ! ( "encountered a fresh type during canonicalization" )
405
393
}
406
394
407
- ty:: Placeholder ( mut placeholder) => {
408
- if !self . canonicalize_mode . preserve_universes ( ) {
409
- placeholder. universe = ty:: UniverseIndex :: ROOT ;
410
- }
411
- self . canonicalize_ty_var (
412
- CanonicalVarInfo { kind : CanonicalVarKind :: PlaceholderTy ( placeholder) } ,
413
- t,
414
- )
395
+ ty:: Placeholder ( placeholder) => {
396
+ let universe = if self . canonicalize_mode . preserve_universes ( ) {
397
+ placeholder. universe
398
+ } else {
399
+ ty:: UniverseIndex :: ROOT
400
+ } ;
401
+ self . canonicalize_ty_var ( CanonicalVarKind :: PlaceholderTy ( universe) , t)
415
402
}
416
403
417
404
ty:: Bound ( debruijn, _) => {
@@ -483,10 +470,7 @@ impl<'cx, 'tcx> TypeFolder<TyCtxt<'tcx>> for Canonicalizer<'cx, 'tcx> {
483
470
// FIXME: perf problem described in #55921.
484
471
ui = ty:: UniverseIndex :: ROOT ;
485
472
}
486
- return self . canonicalize_const_var (
487
- CanonicalVarInfo { kind : CanonicalVarKind :: Const ( ui) } ,
488
- ct,
489
- ) ;
473
+ return self . canonicalize_const_var ( CanonicalVarKind :: Const ( ui) , ct) ;
490
474
}
491
475
}
492
476
}
@@ -501,10 +485,13 @@ impl<'cx, 'tcx> TypeFolder<TyCtxt<'tcx>> for Canonicalizer<'cx, 'tcx> {
501
485
}
502
486
}
503
487
ty:: ConstKind :: Placeholder ( placeholder) => {
504
- return self . canonicalize_const_var (
505
- CanonicalVarInfo { kind : CanonicalVarKind :: PlaceholderConst ( placeholder) } ,
506
- ct,
507
- ) ;
488
+ let universe = if self . canonicalize_mode . preserve_universes ( ) {
489
+ placeholder. universe
490
+ } else {
491
+ ty:: UniverseIndex :: ROOT
492
+ } ;
493
+ return self
494
+ . canonicalize_const_var ( CanonicalVarKind :: PlaceholderConst ( universe) , ct) ;
508
495
}
509
496
_ => { }
510
497
}
@@ -595,7 +582,7 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> {
595
582
debug_assert ! ( !out_value. has_infer( ) && !out_value. has_placeholders( ) ) ;
596
583
597
584
let canonical_variables =
598
- tcx. mk_canonical_var_infos ( & canonicalizer. universe_canonicalized_variables ( ) ) ;
585
+ tcx. mk_canonical_var_kinds ( & canonicalizer. universe_canonicalized_variables ( ) ) ;
599
586
600
587
let max_universe = canonical_variables
601
588
. iter ( )
@@ -610,7 +597,7 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> {
610
597
/// or returns an existing variable if `kind` has already been
611
598
/// seen. `kind` is expected to be an unbound variable (or
612
599
/// potentially a free region).
613
- fn canonical_var ( & mut self , info : CanonicalVarInfo < ' tcx > , kind : GenericArg < ' tcx > ) -> BoundVar {
600
+ fn canonical_var ( & mut self , info : CanonicalVarKind , kind : GenericArg < ' tcx > ) -> BoundVar {
614
601
let Canonicalizer { variables, query_state, indices, .. } = self ;
615
602
616
603
let var_values = & mut query_state. var_values ;
@@ -673,7 +660,7 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> {
673
660
/// Replaces the universe indexes used in `var_values` with their index in
674
661
/// `query_state.universe_map`. This minimizes the maximum universe used in
675
662
/// the canonicalized value.
676
- fn universe_canonicalized_variables ( self ) -> SmallVec < [ CanonicalVarInfo < ' tcx > ; 8 ] > {
663
+ fn universe_canonicalized_variables ( self ) -> SmallVec < [ CanonicalVarKind ; 8 ] > {
677
664
if self . query_state . universe_map . len ( ) == 1 {
678
665
return self . variables ;
679
666
}
@@ -688,37 +675,24 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> {
688
675
689
676
self . variables
690
677
. iter ( )
691
- . map ( |v| CanonicalVarInfo {
692
- kind : match v. kind {
693
- CanonicalVarKind :: Ty ( CanonicalTyVarKind :: Int | CanonicalTyVarKind :: Float ) => {
694
- return * v;
695
- }
696
- CanonicalVarKind :: Ty ( CanonicalTyVarKind :: General ( u) ) => {
697
- CanonicalVarKind :: Ty ( CanonicalTyVarKind :: General ( reverse_universe_map[ & u] ) )
698
- }
699
- CanonicalVarKind :: Region ( u) => {
700
- CanonicalVarKind :: Region ( reverse_universe_map[ & u] )
701
- }
702
- CanonicalVarKind :: Const ( u) => CanonicalVarKind :: Const ( reverse_universe_map[ & u] ) ,
703
- CanonicalVarKind :: PlaceholderTy ( placeholder) => {
704
- CanonicalVarKind :: PlaceholderTy ( ty:: Placeholder {
705
- universe : reverse_universe_map[ & placeholder. universe ] ,
706
- ..placeholder
707
- } )
708
- }
709
- CanonicalVarKind :: PlaceholderRegion ( placeholder) => {
710
- CanonicalVarKind :: PlaceholderRegion ( ty:: Placeholder {
711
- universe : reverse_universe_map[ & placeholder. universe ] ,
712
- ..placeholder
713
- } )
714
- }
715
- CanonicalVarKind :: PlaceholderConst ( placeholder) => {
716
- CanonicalVarKind :: PlaceholderConst ( ty:: Placeholder {
717
- universe : reverse_universe_map[ & placeholder. universe ] ,
718
- ..placeholder
719
- } )
720
- }
721
- } ,
678
+ . map ( |& kind| match kind {
679
+ CanonicalVarKind :: Ty ( CanonicalTyVarKind :: Int | CanonicalTyVarKind :: Float ) => {
680
+ return kind;
681
+ }
682
+ CanonicalVarKind :: Ty ( CanonicalTyVarKind :: General ( u) ) => {
683
+ CanonicalVarKind :: Ty ( CanonicalTyVarKind :: General ( reverse_universe_map[ & u] ) )
684
+ }
685
+ CanonicalVarKind :: Region ( u) => CanonicalVarKind :: Region ( reverse_universe_map[ & u] ) ,
686
+ CanonicalVarKind :: Const ( u) => CanonicalVarKind :: Const ( reverse_universe_map[ & u] ) ,
687
+ CanonicalVarKind :: PlaceholderTy ( ui) => {
688
+ CanonicalVarKind :: PlaceholderTy ( reverse_universe_map[ & ui] )
689
+ }
690
+ CanonicalVarKind :: PlaceholderRegion ( ui) => {
691
+ CanonicalVarKind :: PlaceholderRegion ( reverse_universe_map[ & ui] )
692
+ }
693
+ CanonicalVarKind :: PlaceholderConst ( ui) => {
694
+ CanonicalVarKind :: PlaceholderConst ( reverse_universe_map[ & ui] )
695
+ }
722
696
} )
723
697
. collect ( )
724
698
}
@@ -740,17 +714,14 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> {
740
714
& mut self ,
741
715
r : ty:: Region < ' tcx > ,
742
716
) -> ty:: Region < ' tcx > {
743
- self . canonical_var_for_region (
744
- CanonicalVarInfo { kind : CanonicalVarKind :: Region ( ty:: UniverseIndex :: ROOT ) } ,
745
- r,
746
- )
717
+ self . canonical_var_for_region ( CanonicalVarKind :: Region ( ty:: UniverseIndex :: ROOT ) , r)
747
718
}
748
719
749
720
/// Creates a canonical variable (with the given `info`)
750
721
/// representing the region `r`; return a region referencing it.
751
722
fn canonical_var_for_region (
752
723
& mut self ,
753
- info : CanonicalVarInfo < ' tcx > ,
724
+ info : CanonicalVarKind ,
754
725
r : ty:: Region < ' tcx > ,
755
726
) -> ty:: Region < ' tcx > {
756
727
let var = self . canonical_var ( info, r. into ( ) ) ;
@@ -762,10 +733,10 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> {
762
733
/// if `ty_var` is bound to anything; if so, canonicalize
763
734
/// *that*. Otherwise, create a new canonical variable for
764
735
/// `ty_var`.
765
- fn canonicalize_ty_var ( & mut self , info : CanonicalVarInfo < ' tcx > , ty_var : Ty < ' tcx > ) -> Ty < ' tcx > {
736
+ fn canonicalize_ty_var ( & mut self , info : CanonicalVarKind , ty_var : Ty < ' tcx > ) -> Ty < ' tcx > {
766
737
debug_assert ! ( !self . infcx. is_some_and( |infcx| ty_var != infcx. shallow_resolve( ty_var) ) ) ;
767
738
let var = self . canonical_var ( info, ty_var. into ( ) ) ;
768
- Ty :: new_bound ( self . tcx , self . binder_index , var . into ( ) )
739
+ Ty :: new_bound ( self . tcx , self . binder_index , ty :: BoundTy :: new_anon ( var ) )
769
740
}
770
741
771
742
/// Given a type variable `const_var` of the given kind, first check
@@ -774,7 +745,7 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> {
774
745
/// `const_var`.
775
746
fn canonicalize_const_var (
776
747
& mut self ,
777
- info : CanonicalVarInfo < ' tcx > ,
748
+ info : CanonicalVarKind ,
778
749
const_var : ty:: Const < ' tcx > ,
779
750
) -> ty:: Const < ' tcx > {
780
751
debug_assert ! (
0 commit comments