diff options
Diffstat (limited to 'crates/hir_ty/src/infer/unify.rs')
-rw-r--r-- | crates/hir_ty/src/infer/unify.rs | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/crates/hir_ty/src/infer/unify.rs b/crates/hir_ty/src/infer/unify.rs index ebc612ca9..66f8fe8a3 100644 --- a/crates/hir_ty/src/infer/unify.rs +++ b/crates/hir_ty/src/infer/unify.rs | |||
@@ -7,8 +7,8 @@ use ena::unify::{InPlaceUnificationTable, NoError, UnifyKey, UnifyValue}; | |||
7 | 7 | ||
8 | use super::{InferenceContext, Obligation}; | 8 | use super::{InferenceContext, Obligation}; |
9 | use crate::{ | 9 | use crate::{ |
10 | BoundVar, Canonical, DebruijnIndex, GenericPredicate, InEnvironment, InferenceVar, Interner, | 10 | BoundVar, Canonical, DebruijnIndex, FnPointer, GenericPredicate, InEnvironment, InferenceVar, |
11 | Scalar, Substs, Ty, TyKind, TypeWalk, | 11 | Interner, Scalar, Substs, Ty, TyKind, TypeWalk, |
12 | }; | 12 | }; |
13 | 13 | ||
14 | impl<'a> InferenceContext<'a> { | 14 | impl<'a> InferenceContext<'a> { |
@@ -108,7 +108,7 @@ impl<T> Canonicalized<T> { | |||
108 | pub(super) fn decanonicalize_ty(&self, mut ty: Ty) -> Ty { | 108 | pub(super) fn decanonicalize_ty(&self, mut ty: Ty) -> Ty { |
109 | ty.walk_mut_binders( | 109 | ty.walk_mut_binders( |
110 | &mut |ty, binders| { | 110 | &mut |ty, binders| { |
111 | if let &mut TyKind::BoundVar(bound) = &mut ty.0 { | 111 | if let &mut TyKind::BoundVar(bound) = ty.interned_mut() { |
112 | if bound.debruijn >= binders { | 112 | if bound.debruijn >= binders { |
113 | let (v, k) = self.free_vars[bound.index]; | 113 | let (v, k) = self.free_vars[bound.index]; |
114 | *ty = TyKind::InferenceVar(v, k).intern(&Interner); | 114 | *ty = TyKind::InferenceVar(v, k).intern(&Interner); |
@@ -283,9 +283,23 @@ impl InferenceTable { | |||
283 | let ty1 = self.resolve_ty_shallow(ty1); | 283 | let ty1 = self.resolve_ty_shallow(ty1); |
284 | let ty2 = self.resolve_ty_shallow(ty2); | 284 | let ty2 = self.resolve_ty_shallow(ty2); |
285 | if ty1.equals_ctor(&ty2) { | 285 | if ty1.equals_ctor(&ty2) { |
286 | match (ty1.substs(), ty2.substs()) { | 286 | match (ty1.interned(&Interner), ty2.interned(&Interner)) { |
287 | (Some(st1), Some(st2)) => self.unify_substs(st1, st2, depth + 1), | 287 | (TyKind::Adt(_, substs1), TyKind::Adt(_, substs2)) |
288 | (None, None) => true, | 288 | | (TyKind::FnDef(_, substs1), TyKind::FnDef(_, substs2)) |
289 | | ( | ||
290 | TyKind::Function(FnPointer { substs: substs1, .. }), | ||
291 | TyKind::Function(FnPointer { substs: substs2, .. }), | ||
292 | ) | ||
293 | | (TyKind::Tuple(_, substs1), TyKind::Tuple(_, substs2)) | ||
294 | | (TyKind::OpaqueType(_, substs1), TyKind::OpaqueType(_, substs2)) | ||
295 | | (TyKind::AssociatedType(_, substs1), TyKind::AssociatedType(_, substs2)) | ||
296 | | (TyKind::Closure(.., substs1), TyKind::Closure(.., substs2)) => { | ||
297 | self.unify_substs(substs1, substs2, depth + 1) | ||
298 | } | ||
299 | (TyKind::Ref(_, ty1), TyKind::Ref(_, ty2)) | ||
300 | | (TyKind::Raw(_, ty1), TyKind::Raw(_, ty2)) | ||
301 | | (TyKind::Array(ty1), TyKind::Array(ty2)) | ||
302 | | (TyKind::Slice(ty1), TyKind::Slice(ty2)) => self.unify_inner(ty1, ty2, depth + 1), | ||
289 | _ => false, | 303 | _ => false, |
290 | } | 304 | } |
291 | } else { | 305 | } else { |
@@ -404,7 +418,7 @@ impl InferenceTable { | |||
404 | if i > 0 { | 418 | if i > 0 { |
405 | cov_mark::hit!(type_var_resolves_to_int_var); | 419 | cov_mark::hit!(type_var_resolves_to_int_var); |
406 | } | 420 | } |
407 | match &ty.0 { | 421 | match ty.interned(&Interner) { |
408 | TyKind::InferenceVar(tv, _) => { | 422 | TyKind::InferenceVar(tv, _) => { |
409 | let inner = tv.to_inner(); | 423 | let inner = tv.to_inner(); |
410 | match self.var_unification_table.inlined_probe_value(inner).known() { | 424 | match self.var_unification_table.inlined_probe_value(inner).known() { |