@@ -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 > {
@@ -174,10 +173,8 @@ impl CanonicalizeMode for CanonicalizeQueryResponse {
174
173
match r. kind ( ) {
175
174
ty:: ReLateParam ( _) | ty:: ReErased | ty:: ReStatic | ty:: ReEarlyParam ( ..) => r,
176
175
177
- ty:: RePlaceholder ( placeholder) => canonicalizer. canonical_var_for_region (
178
- CanonicalVarInfo { kind : CanonicalVarKind :: PlaceholderRegion ( placeholder) } ,
179
- r,
180
- ) ,
176
+ ty:: RePlaceholder ( placeholder) => canonicalizer
177
+ . canonical_var_for_region ( CanonicalVarKind :: PlaceholderRegion ( placeholder) , r) ,
181
178
182
179
ty:: ReVar ( vid) => {
183
180
let universe = infcx
@@ -186,10 +183,7 @@ impl CanonicalizeMode for CanonicalizeQueryResponse {
186
183
. unwrap_region_constraints ( )
187
184
. probe_value ( vid)
188
185
. unwrap_err ( ) ;
189
- canonicalizer. canonical_var_for_region (
190
- CanonicalVarInfo { kind : CanonicalVarKind :: Region ( universe) } ,
191
- r,
192
- )
186
+ canonicalizer. canonical_var_for_region ( CanonicalVarKind :: Region ( universe) , r)
193
187
}
194
188
195
189
_ => {
@@ -294,7 +288,7 @@ struct Canonicalizer<'cx, 'tcx> {
294
288
/// Set to `None` to disable the resolution of inference variables.
295
289
infcx : Option < & ' cx InferCtxt < ' tcx > > ,
296
290
tcx : TyCtxt < ' tcx > ,
297
- variables : SmallVec < [ CanonicalVarInfo < ' tcx > ; 8 ] > ,
291
+ variables : SmallVec < [ CanonicalVarKind < ' tcx > ; 8 ] > ,
298
292
query_state : & ' cx mut OriginalQueryValues < ' tcx > ,
299
293
// Note that indices is only used once `var_values` is big enough to be
300
294
// heap-allocated.
@@ -368,9 +362,7 @@ impl<'cx, 'tcx> TypeFolder<TyCtxt<'tcx>> for Canonicalizer<'cx, 'tcx> {
368
362
ui = ty:: UniverseIndex :: ROOT ;
369
363
}
370
364
self . canonicalize_ty_var (
371
- CanonicalVarInfo {
372
- kind : CanonicalVarKind :: Ty ( CanonicalTyVarKind :: General ( ui) ) ,
373
- } ,
365
+ CanonicalVarKind :: Ty ( CanonicalTyVarKind :: General ( ui) ) ,
374
366
t,
375
367
)
376
368
}
@@ -382,21 +374,15 @@ impl<'cx, 'tcx> TypeFolder<TyCtxt<'tcx>> for Canonicalizer<'cx, 'tcx> {
382
374
if nt != t {
383
375
return self . fold_ty ( nt) ;
384
376
} else {
385
- self . canonicalize_ty_var (
386
- CanonicalVarInfo { kind : CanonicalVarKind :: Ty ( CanonicalTyVarKind :: Int ) } ,
387
- t,
388
- )
377
+ self . canonicalize_ty_var ( CanonicalVarKind :: Ty ( CanonicalTyVarKind :: Int ) , t)
389
378
}
390
379
}
391
380
ty:: Infer ( ty:: FloatVar ( vid) ) => {
392
381
let nt = self . infcx . unwrap ( ) . opportunistic_resolve_float_var ( vid) ;
393
382
if nt != t {
394
383
return self . fold_ty ( nt) ;
395
384
} else {
396
- self . canonicalize_ty_var (
397
- CanonicalVarInfo { kind : CanonicalVarKind :: Ty ( CanonicalTyVarKind :: Float ) } ,
398
- t,
399
- )
385
+ self . canonicalize_ty_var ( CanonicalVarKind :: Ty ( CanonicalTyVarKind :: Float ) , t)
400
386
}
401
387
}
402
388
@@ -408,10 +394,7 @@ impl<'cx, 'tcx> TypeFolder<TyCtxt<'tcx>> for Canonicalizer<'cx, 'tcx> {
408
394
if !self . canonicalize_mode . preserve_universes ( ) {
409
395
placeholder. universe = ty:: UniverseIndex :: ROOT ;
410
396
}
411
- self . canonicalize_ty_var (
412
- CanonicalVarInfo { kind : CanonicalVarKind :: PlaceholderTy ( placeholder) } ,
413
- t,
414
- )
397
+ self . canonicalize_ty_var ( CanonicalVarKind :: PlaceholderTy ( placeholder) , t)
415
398
}
416
399
417
400
ty:: Bound ( debruijn, _) => {
@@ -483,10 +466,7 @@ impl<'cx, 'tcx> TypeFolder<TyCtxt<'tcx>> for Canonicalizer<'cx, 'tcx> {
483
466
// FIXME: perf problem described in #55921.
484
467
ui = ty:: UniverseIndex :: ROOT ;
485
468
}
486
- return self . canonicalize_const_var (
487
- CanonicalVarInfo { kind : CanonicalVarKind :: Const ( ui) } ,
488
- ct,
489
- ) ;
469
+ return self . canonicalize_const_var ( CanonicalVarKind :: Const ( ui) , ct) ;
490
470
}
491
471
}
492
472
}
@@ -501,10 +481,8 @@ impl<'cx, 'tcx> TypeFolder<TyCtxt<'tcx>> for Canonicalizer<'cx, 'tcx> {
501
481
}
502
482
}
503
483
ty:: ConstKind :: Placeholder ( placeholder) => {
504
- return self . canonicalize_const_var (
505
- CanonicalVarInfo { kind : CanonicalVarKind :: PlaceholderConst ( placeholder) } ,
506
- ct,
507
- ) ;
484
+ return self
485
+ . canonicalize_const_var ( CanonicalVarKind :: PlaceholderConst ( placeholder) , ct) ;
508
486
}
509
487
_ => { }
510
488
}
@@ -595,7 +573,7 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> {
595
573
debug_assert ! ( !out_value. has_infer( ) && !out_value. has_placeholders( ) ) ;
596
574
597
575
let canonical_variables =
598
- tcx. mk_canonical_var_infos ( & canonicalizer. universe_canonicalized_variables ( ) ) ;
576
+ tcx. mk_canonical_var_kinds ( & canonicalizer. universe_canonicalized_variables ( ) ) ;
599
577
600
578
let max_universe = canonical_variables
601
579
. iter ( )
@@ -610,18 +588,22 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> {
610
588
/// or returns an existing variable if `kind` has already been
611
589
/// seen. `kind` is expected to be an unbound variable (or
612
590
/// potentially a free region).
613
- fn canonical_var ( & mut self , info : CanonicalVarInfo < ' tcx > , kind : GenericArg < ' tcx > ) -> BoundVar {
591
+ fn canonical_var (
592
+ & mut self ,
593
+ var_kind : CanonicalVarKind < ' tcx > ,
594
+ value : GenericArg < ' tcx > ,
595
+ ) -> BoundVar {
614
596
let Canonicalizer { variables, query_state, indices, .. } = self ;
615
597
616
598
let var_values = & mut query_state. var_values ;
617
599
618
- let universe = info . universe ( ) ;
600
+ let universe = var_kind . universe ( ) ;
619
601
if universe != ty:: UniverseIndex :: ROOT {
620
602
assert ! ( self . canonicalize_mode. preserve_universes( ) ) ;
621
603
622
604
// Insert universe into the universe map. To preserve the order of the
623
605
// universes in the value being canonicalized, we don't update the
624
- // universe in `info ` until we have finished canonicalizing.
606
+ // universe in `var_kind ` until we have finished canonicalizing.
625
607
match query_state. universe_map . binary_search ( & universe) {
626
608
Err ( idx) => query_state. universe_map . insert ( idx, universe) ,
627
609
Ok ( _) => { }
@@ -636,14 +618,14 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> {
636
618
if !var_values. spilled ( ) {
637
619
// `var_values` is stack-allocated. `indices` isn't used yet. Do a
638
620
// direct linear search of `var_values`.
639
- if let Some ( idx) = var_values. iter ( ) . position ( |& k| k == kind ) {
621
+ if let Some ( idx) = var_values. iter ( ) . position ( |& v| v == value ) {
640
622
// `kind` is already present in `var_values`.
641
623
BoundVar :: new ( idx)
642
624
} else {
643
625
// `kind` isn't present in `var_values`. Append it. Likewise
644
- // for `info ` and `variables`.
645
- variables. push ( info ) ;
646
- var_values. push ( kind ) ;
626
+ // for `var_kind ` and `variables`.
627
+ variables. push ( var_kind ) ;
628
+ var_values. push ( value ) ;
647
629
assert_eq ! ( variables. len( ) , var_values. len( ) ) ;
648
630
649
631
// If `var_values` has become big enough to be heap-allocated,
@@ -653,17 +635,17 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> {
653
635
* indices = var_values
654
636
. iter ( )
655
637
. enumerate ( )
656
- . map ( |( i, & kind ) | ( kind , BoundVar :: new ( i) ) )
638
+ . map ( |( i, & value ) | ( value , BoundVar :: new ( i) ) )
657
639
. collect ( ) ;
658
640
}
659
641
// The cv is the index of the appended element.
660
642
BoundVar :: new ( var_values. len ( ) - 1 )
661
643
}
662
644
} else {
663
645
// `var_values` is large. Do a hashmap search via `indices`.
664
- * indices. entry ( kind ) . or_insert_with ( || {
665
- variables. push ( info ) ;
666
- var_values. push ( kind ) ;
646
+ * indices. entry ( value ) . or_insert_with ( || {
647
+ variables. push ( var_kind ) ;
648
+ var_values. push ( value ) ;
667
649
assert_eq ! ( variables. len( ) , var_values. len( ) ) ;
668
650
BoundVar :: new ( variables. len ( ) - 1 )
669
651
} )
@@ -673,7 +655,7 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> {
673
655
/// Replaces the universe indexes used in `var_values` with their index in
674
656
/// `query_state.universe_map`. This minimizes the maximum universe used in
675
657
/// the canonicalized value.
676
- fn universe_canonicalized_variables ( self ) -> SmallVec < [ CanonicalVarInfo < ' tcx > ; 8 ] > {
658
+ fn universe_canonicalized_variables ( self ) -> SmallVec < [ CanonicalVarKind < ' tcx > ; 8 ] > {
677
659
if self . query_state . universe_map . len ( ) == 1 {
678
660
return self . variables ;
679
661
}
@@ -688,37 +670,33 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> {
688
670
689
671
self . variables
690
672
. 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
- } ,
673
+ . map ( |& kind| match kind {
674
+ CanonicalVarKind :: Ty ( CanonicalTyVarKind :: Int | CanonicalTyVarKind :: Float ) => {
675
+ return kind;
676
+ }
677
+ CanonicalVarKind :: Ty ( CanonicalTyVarKind :: General ( u) ) => {
678
+ CanonicalVarKind :: Ty ( CanonicalTyVarKind :: General ( reverse_universe_map[ & u] ) )
679
+ }
680
+ CanonicalVarKind :: Region ( u) => CanonicalVarKind :: Region ( reverse_universe_map[ & u] ) ,
681
+ CanonicalVarKind :: Const ( u) => CanonicalVarKind :: Const ( reverse_universe_map[ & u] ) ,
682
+ CanonicalVarKind :: PlaceholderTy ( placeholder) => {
683
+ CanonicalVarKind :: PlaceholderTy ( ty:: Placeholder {
684
+ universe : reverse_universe_map[ & placeholder. universe ] ,
685
+ ..placeholder
686
+ } )
687
+ }
688
+ CanonicalVarKind :: PlaceholderRegion ( placeholder) => {
689
+ CanonicalVarKind :: PlaceholderRegion ( ty:: Placeholder {
690
+ universe : reverse_universe_map[ & placeholder. universe ] ,
691
+ ..placeholder
692
+ } )
693
+ }
694
+ CanonicalVarKind :: PlaceholderConst ( placeholder) => {
695
+ CanonicalVarKind :: PlaceholderConst ( ty:: Placeholder {
696
+ universe : reverse_universe_map[ & placeholder. universe ] ,
697
+ ..placeholder
698
+ } )
699
+ }
722
700
} )
723
701
. collect ( )
724
702
}
@@ -740,20 +718,17 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> {
740
718
& mut self ,
741
719
r : ty:: Region < ' tcx > ,
742
720
) -> ty:: Region < ' tcx > {
743
- self . canonical_var_for_region (
744
- CanonicalVarInfo { kind : CanonicalVarKind :: Region ( ty:: UniverseIndex :: ROOT ) } ,
745
- r,
746
- )
721
+ self . canonical_var_for_region ( CanonicalVarKind :: Region ( ty:: UniverseIndex :: ROOT ) , r)
747
722
}
748
723
749
724
/// Creates a canonical variable (with the given `info`)
750
725
/// representing the region `r`; return a region referencing it.
751
726
fn canonical_var_for_region (
752
727
& mut self ,
753
- info : CanonicalVarInfo < ' tcx > ,
728
+ var_kind : CanonicalVarKind < ' tcx > ,
754
729
r : ty:: Region < ' tcx > ,
755
730
) -> ty:: Region < ' tcx > {
756
- let var = self . canonical_var ( info , r. into ( ) ) ;
731
+ let var = self . canonical_var ( var_kind , r. into ( ) ) ;
757
732
let br = ty:: BoundRegion { var, kind : ty:: BoundRegionKind :: Anon } ;
758
733
ty:: Region :: new_bound ( self . cx ( ) , self . binder_index , br)
759
734
}
@@ -762,9 +737,13 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> {
762
737
/// if `ty_var` is bound to anything; if so, canonicalize
763
738
/// *that*. Otherwise, create a new canonical variable for
764
739
/// `ty_var`.
765
- fn canonicalize_ty_var ( & mut self , info : CanonicalVarInfo < ' tcx > , ty_var : Ty < ' tcx > ) -> Ty < ' tcx > {
740
+ fn canonicalize_ty_var (
741
+ & mut self ,
742
+ var_kind : CanonicalVarKind < ' tcx > ,
743
+ ty_var : Ty < ' tcx > ,
744
+ ) -> Ty < ' tcx > {
766
745
debug_assert ! ( !self . infcx. is_some_and( |infcx| ty_var != infcx. shallow_resolve( ty_var) ) ) ;
767
- let var = self . canonical_var ( info , ty_var. into ( ) ) ;
746
+ let var = self . canonical_var ( var_kind , ty_var. into ( ) ) ;
768
747
Ty :: new_bound ( self . tcx , self . binder_index , var. into ( ) )
769
748
}
770
749
@@ -774,13 +753,13 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> {
774
753
/// `const_var`.
775
754
fn canonicalize_const_var (
776
755
& mut self ,
777
- info : CanonicalVarInfo < ' tcx > ,
778
- const_var : ty:: Const < ' tcx > ,
756
+ var_kind : CanonicalVarKind < ' tcx > ,
757
+ ct_var : ty:: Const < ' tcx > ,
779
758
) -> ty:: Const < ' tcx > {
780
759
debug_assert ! (
781
- !self . infcx. is_some_and( |infcx| const_var != infcx. shallow_resolve_const( const_var ) )
760
+ !self . infcx. is_some_and( |infcx| ct_var != infcx. shallow_resolve_const( ct_var ) )
782
761
) ;
783
- let var = self . canonical_var ( info , const_var . into ( ) ) ;
762
+ let var = self . canonical_var ( var_kind , ct_var . into ( ) ) ;
784
763
ty:: Const :: new_bound ( self . tcx , self . binder_index , var)
785
764
}
786
765
}
0 commit comments