@@ -51,7 +51,7 @@ impl<'a, 'b> Canonicalizer<'a, 'b> {
51
51
t. fold_binders (
52
52
& mut |ty, binders| match ty. kind ( & Interner ) {
53
53
& TyKind :: InferenceVar ( var, kind) => {
54
- let inner = var . to_inner ( ) ;
54
+ let inner = from_inference_var ( var ) ;
55
55
if self . var_stack . contains ( & inner) {
56
56
// recursive type
57
57
return self . ctx . table . type_variable_table . fallback_value ( var, kind) ;
@@ -65,7 +65,7 @@ impl<'a, 'b> Canonicalizer<'a, 'b> {
65
65
result
66
66
} else {
67
67
let root = self . ctx . table . var_unification_table . find ( inner) ;
68
- let position = self . add ( InferenceVar :: from_inner ( root) , kind) ;
68
+ let position = self . add ( to_inference_var ( root) , kind) ;
69
69
TyKind :: BoundVar ( BoundVar :: new ( binders, position) ) . intern ( & Interner )
70
70
}
71
71
}
@@ -207,16 +207,16 @@ impl TypeVariableTable {
207
207
}
208
208
209
209
pub ( super ) fn set_diverging ( & mut self , iv : InferenceVar , diverging : bool ) {
210
- self . inner [ iv . to_inner ( ) . 0 as usize ] . diverging = diverging;
210
+ self . inner [ from_inference_var ( iv ) . 0 as usize ] . diverging = diverging;
211
211
}
212
212
213
213
fn is_diverging ( & mut self , iv : InferenceVar ) -> bool {
214
- self . inner [ iv . to_inner ( ) . 0 as usize ] . diverging
214
+ self . inner [ from_inference_var ( iv ) . 0 as usize ] . diverging
215
215
}
216
216
217
217
fn fallback_value ( & self , iv : InferenceVar , kind : TyVariableKind ) -> Ty {
218
218
match kind {
219
- _ if self . inner [ iv . to_inner ( ) . 0 as usize ] . diverging => TyKind :: Never ,
219
+ _ if self . inner [ from_inference_var ( iv ) . 0 as usize ] . diverging => TyKind :: Never ,
220
220
TyVariableKind :: General => TyKind :: Error ,
221
221
TyVariableKind :: Integer => TyKind :: Scalar ( Scalar :: Int ( IntTy :: I32 ) ) ,
222
222
TyVariableKind :: Float => TyKind :: Scalar ( Scalar :: Float ( FloatTy :: F64 ) ) ,
@@ -250,7 +250,7 @@ impl InferenceTable {
250
250
self . type_variable_table . push ( TypeVariableData { diverging } ) ;
251
251
let key = self . var_unification_table . new_key ( TypeVarValue :: Unknown ) ;
252
252
assert_eq ! ( key. 0 as usize , self . type_variable_table. inner. len( ) - 1 ) ;
253
- TyKind :: InferenceVar ( InferenceVar :: from_inner ( key) , kind) . intern ( & Interner )
253
+ TyKind :: InferenceVar ( to_inference_var ( key) , kind) . intern ( & Interner )
254
254
}
255
255
256
256
pub ( crate ) fn new_type_var ( & mut self ) -> Ty {
@@ -369,8 +369,12 @@ impl InferenceTable {
369
369
== self . type_variable_table . is_diverging ( * tv2) =>
370
370
{
371
371
// both type vars are unknown since we tried to resolve them
372
- if !self . var_unification_table . unioned ( tv1. to_inner ( ) , tv2. to_inner ( ) ) {
373
- self . var_unification_table . union ( tv1. to_inner ( ) , tv2. to_inner ( ) ) ;
372
+ if !self
373
+ . var_unification_table
374
+ . unioned ( from_inference_var ( * tv1) , from_inference_var ( * tv2) )
375
+ {
376
+ self . var_unification_table
377
+ . union ( from_inference_var ( * tv1) , from_inference_var ( * tv2) ) ;
374
378
self . revision += 1 ;
375
379
}
376
380
true
@@ -407,7 +411,7 @@ impl InferenceTable {
407
411
) => {
408
412
// the type var is unknown since we tried to resolve it
409
413
self . var_unification_table . union_value (
410
- tv . to_inner ( ) ,
414
+ from_inference_var ( * tv ) ,
411
415
TypeVarValue :: Known ( other. clone ( ) . intern ( & Interner ) ) ,
412
416
) ;
413
417
self . revision += 1 ;
@@ -462,7 +466,7 @@ impl InferenceTable {
462
466
}
463
467
match ty. kind ( & Interner ) {
464
468
TyKind :: InferenceVar ( tv, _) => {
465
- let inner = tv . to_inner ( ) ;
469
+ let inner = from_inference_var ( * tv ) ;
466
470
match self . var_unification_table . inlined_probe_value ( inner) . known ( ) {
467
471
Some ( known_ty) => {
468
472
// The known_ty can't be a type var itself
@@ -485,7 +489,7 @@ impl InferenceTable {
485
489
fn resolve_ty_as_possible_inner ( & mut self , tv_stack : & mut Vec < TypeVarId > , ty : Ty ) -> Ty {
486
490
ty. fold ( & mut |ty| match ty. kind ( & Interner ) {
487
491
& TyKind :: InferenceVar ( tv, kind) => {
488
- let inner = tv . to_inner ( ) ;
492
+ let inner = from_inference_var ( tv ) ;
489
493
if tv_stack. contains ( & inner) {
490
494
cov_mark:: hit!( type_var_cycles_resolve_as_possible) ;
491
495
// recursive type
@@ -512,7 +516,7 @@ impl InferenceTable {
512
516
fn resolve_ty_completely_inner ( & mut self , tv_stack : & mut Vec < TypeVarId > , ty : Ty ) -> Ty {
513
517
ty. fold ( & mut |ty| match ty. kind ( & Interner ) {
514
518
& TyKind :: InferenceVar ( tv, kind) => {
515
- let inner = tv . to_inner ( ) ;
519
+ let inner = from_inference_var ( tv ) ;
516
520
if tv_stack. contains ( & inner) {
517
521
cov_mark:: hit!( type_var_cycles_resolve_completely) ;
518
522
// recursive type
@@ -555,6 +559,14 @@ impl UnifyKey for TypeVarId {
555
559
}
556
560
}
557
561
562
+ fn from_inference_var ( var : InferenceVar ) -> TypeVarId {
563
+ TypeVarId ( var. index ( ) )
564
+ }
565
+
566
+ fn to_inference_var ( TypeVarId ( index) : TypeVarId ) -> InferenceVar {
567
+ index. into ( )
568
+ }
569
+
558
570
/// The value of a type variable: either we already know the type, or we don't
559
571
/// know it yet.
560
572
#[ derive( Clone , PartialEq , Eq , Debug ) ]
0 commit comments