diff options
Diffstat (limited to 'crates/hir_ty/src/infer/unify.rs')
-rw-r--r-- | crates/hir_ty/src/infer/unify.rs | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/crates/hir_ty/src/infer/unify.rs b/crates/hir_ty/src/infer/unify.rs index 6e7b0f5a6..5ea4b7481 100644 --- a/crates/hir_ty/src/infer/unify.rs +++ b/crates/hir_ty/src/infer/unify.rs | |||
@@ -231,6 +231,7 @@ pub(crate) struct TypeVariableData { | |||
231 | pub(crate) struct InferenceTable { | 231 | pub(crate) struct InferenceTable { |
232 | pub(super) var_unification_table: InPlaceUnificationTable<TypeVarId>, | 232 | pub(super) var_unification_table: InPlaceUnificationTable<TypeVarId>, |
233 | pub(super) type_variable_table: TypeVariableTable, | 233 | pub(super) type_variable_table: TypeVariableTable, |
234 | pub(super) revision: u32, | ||
234 | } | 235 | } |
235 | 236 | ||
236 | impl InferenceTable { | 237 | impl InferenceTable { |
@@ -238,6 +239,7 @@ impl InferenceTable { | |||
238 | InferenceTable { | 239 | InferenceTable { |
239 | var_unification_table: InPlaceUnificationTable::new(), | 240 | var_unification_table: InPlaceUnificationTable::new(), |
240 | type_variable_table: TypeVariableTable { inner: Vec::new() }, | 241 | type_variable_table: TypeVariableTable { inner: Vec::new() }, |
242 | revision: 0, | ||
241 | } | 243 | } |
242 | } | 244 | } |
243 | 245 | ||
@@ -360,7 +362,10 @@ impl InferenceTable { | |||
360 | == self.type_variable_table.is_diverging(*tv2) => | 362 | == self.type_variable_table.is_diverging(*tv2) => |
361 | { | 363 | { |
362 | // both type vars are unknown since we tried to resolve them | 364 | // both type vars are unknown since we tried to resolve them |
363 | self.var_unification_table.union(tv1.to_inner(), tv2.to_inner()); | 365 | if !self.var_unification_table.unioned(tv1.to_inner(), tv2.to_inner()) { |
366 | self.var_unification_table.union(tv1.to_inner(), tv2.to_inner()); | ||
367 | self.revision += 1; | ||
368 | } | ||
364 | true | 369 | true |
365 | } | 370 | } |
366 | 371 | ||
@@ -398,6 +403,7 @@ impl InferenceTable { | |||
398 | tv.to_inner(), | 403 | tv.to_inner(), |
399 | TypeVarValue::Known(other.clone().intern(&Interner)), | 404 | TypeVarValue::Known(other.clone().intern(&Interner)), |
400 | ); | 405 | ); |
406 | self.revision += 1; | ||
401 | true | 407 | true |
402 | } | 408 | } |
403 | 409 | ||