@@ -158,35 +158,15 @@ impl<'t, I: Interner> Unifier<'t, I> {
158
158
( _, & TyKind :: Alias ( ref alias) ) => self . relate_alias_ty ( variance. invert ( ) , alias, a) ,
159
159
( & TyKind :: Alias ( ref alias) , _) => self . relate_alias_ty ( variance, alias, b) ,
160
160
161
- // FIXME: needs to handle relating a var and ty; needs generalization
162
- // Relating an inference variable with a non-inference variable.
163
- ( a_data @ & TyKind :: InferenceVar ( _, _) , b_data @ _)
164
- | ( a_data @ _, b_data @ & TyKind :: InferenceVar ( _, _) ) => {
165
- // Correct variance when we flip a/b.
166
- let ( new_variance, var, kind, ty_data) = match ( a_data, b_data) {
167
- ( & TyKind :: InferenceVar ( var, kind) , ty_data @ _) => {
168
- ( variance, var, kind, ty_data)
169
- }
170
- ( ty_data @ _, & TyKind :: InferenceVar ( var, kind) ) => {
171
- // var is grabbed from 'b', but given in as the left
172
- // parameter to relate_var_ty, so we need to flip variance.
173
- ( variance. invert ( ) , var, kind, ty_data)
174
- }
175
- _ => unreachable ! ( ) ,
176
- } ;
177
-
161
+ ( & TyKind :: InferenceVar ( var, kind) , ty_data @ _) => {
178
162
let ty = ty_data. clone ( ) . intern ( interner) ;
179
- match ( kind, ty. is_integer ( interner) , ty. is_float ( interner) ) {
180
- // General inference variables can unify with any type
181
- ( TyVariableKind :: General , _, _)
182
- // Integer inference variables can only unify with integer types
183
- | ( TyVariableKind :: Integer , true , _)
184
- // Float inference variables can only unify with float types
185
- | ( TyVariableKind :: Float , _, true ) => {
186
- self . relate_var_ty ( new_variance, var, & ty)
187
- } ,
188
- _ => Err ( NoSolution ) ,
189
- }
163
+ self . relate_var_ty ( variance, var, kind, & ty)
164
+ }
165
+ ( ty_data @ _, & TyKind :: InferenceVar ( var, kind) ) => {
166
+ // We need to invert the variance if inference var is `b` because we pass it in
167
+ // as `a` to relate_var_ty
168
+ let ty = ty_data. clone ( ) . intern ( interner) ;
169
+ self . relate_var_ty ( variance. invert ( ) , var, kind, & ty)
190
170
}
191
171
192
172
// This would correspond to unifying a `fn` type with a non-fn
@@ -756,8 +736,26 @@ impl<'t, I: Interner> Unifier<'t, I> {
756
736
/// - `ty` does not reference anything in a lifetime that could not be named in `var`
757
737
/// (the extended `OccursCheck` created to handle universes)
758
738
#[ instrument( level = "debug" , skip( self ) ) ]
759
- fn relate_var_ty ( & mut self , variance : Variance , var : InferenceVar , ty : & Ty < I > ) -> Fallible < ( ) > {
739
+ fn relate_var_ty (
740
+ & mut self ,
741
+ variance : Variance ,
742
+ var : InferenceVar ,
743
+ var_kind : TyVariableKind ,
744
+ ty : & Ty < I > ,
745
+ ) -> Fallible < ( ) > {
760
746
let interner = self . interner ;
747
+
748
+ match ( var_kind, ty. is_integer ( interner) , ty. is_float ( interner) ) {
749
+ // General inference variables can unify with any type
750
+ ( TyVariableKind :: General , _, _)
751
+ // Integer inference variables can only unify with integer types
752
+ | ( TyVariableKind :: Integer , true , _)
753
+ // Float inference variables can only unify with float types
754
+ | ( TyVariableKind :: Float , _, true ) => {
755
+ } ,
756
+ _ => return Err ( NoSolution ) ,
757
+ }
758
+
761
759
let var = EnaVariable :: from ( var) ;
762
760
763
761
// Determine the universe index associated with this
0 commit comments