diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2021-03-15 12:51:27 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2021-03-15 12:51:27 +0000 |
commit | 6139bd764974318814edfd5427e2a2e8220b211b (patch) | |
tree | 70aa9b1a1b338f0c02545cb544ab37c4547f7ce2 /crates/hir_ty/src/infer/coerce.rs | |
parent | a8b319cf28c0985d964ef6624c3ee6e7f09afb2d (diff) | |
parent | 42217738e0b121a8e5d48a9a55cb51ef6c98975f (diff) |
Merge #8018
8018: Make Ty wrap TyKind in an Arc r=flodiebold a=flodiebold
... to further move towards Chalk.
This is a bit of a slowdown (218ginstr vs 213ginstr for inference on RA), even though it allows us to unwrap the Substs in `TyKind::Ref` etc..
Co-authored-by: Florian Diebold <[email protected]>
Diffstat (limited to 'crates/hir_ty/src/infer/coerce.rs')
-rw-r--r-- | crates/hir_ty/src/infer/coerce.rs | 12 |
1 files changed, 3 insertions, 9 deletions
diff --git a/crates/hir_ty/src/infer/coerce.rs b/crates/hir_ty/src/infer/coerce.rs index 36670043a..137419264 100644 --- a/crates/hir_ty/src/infer/coerce.rs +++ b/crates/hir_ty/src/infer/coerce.rs | |||
@@ -71,7 +71,7 @@ impl<'a> InferenceContext<'a> { | |||
71 | } | 71 | } |
72 | 72 | ||
73 | // Pointer weakening and function to pointer | 73 | // Pointer weakening and function to pointer |
74 | match (&mut from_ty.0, to_ty.interned(&Interner)) { | 74 | match (from_ty.interned_mut(), to_ty.interned(&Interner)) { |
75 | // `*mut T` -> `*const T` | 75 | // `*mut T` -> `*const T` |
76 | // `&mut T` -> `&T` | 76 | // `&mut T` -> `&T` |
77 | (TyKind::Raw(m1, ..), TyKind::Raw(m2 @ Mutability::Not, ..)) | 77 | (TyKind::Raw(m1, ..), TyKind::Raw(m2 @ Mutability::Not, ..)) |
@@ -111,9 +111,7 @@ impl<'a> InferenceContext<'a> { | |||
111 | // Auto Deref if cannot coerce | 111 | // Auto Deref if cannot coerce |
112 | match (from_ty.interned(&Interner), to_ty.interned(&Interner)) { | 112 | match (from_ty.interned(&Interner), to_ty.interned(&Interner)) { |
113 | // FIXME: DerefMut | 113 | // FIXME: DerefMut |
114 | (TyKind::Ref(_, st1), TyKind::Ref(_, st2)) => { | 114 | (TyKind::Ref(_, st1), TyKind::Ref(_, st2)) => self.unify_autoderef_behind_ref(st1, st2), |
115 | self.unify_autoderef_behind_ref(&st1[0], &st2[0]) | ||
116 | } | ||
117 | 115 | ||
118 | // Otherwise, normal unify | 116 | // Otherwise, normal unify |
119 | _ => self.unify(&from_ty, to_ty), | 117 | _ => self.unify(&from_ty, to_ty), |
@@ -178,11 +176,7 @@ impl<'a> InferenceContext<'a> { | |||
178 | // Stop when constructor matches. | 176 | // Stop when constructor matches. |
179 | if from_ty.equals_ctor(&to_ty) { | 177 | if from_ty.equals_ctor(&to_ty) { |
180 | // It will not recurse to `coerce`. | 178 | // It will not recurse to `coerce`. |
181 | return match (from_ty.substs(), to_ty.substs()) { | 179 | return self.table.unify(&from_ty, &to_ty); |
182 | (Some(st1), Some(st2)) => self.table.unify_substs(st1, st2, 0), | ||
183 | (None, None) => true, | ||
184 | _ => false, | ||
185 | }; | ||
186 | } else if self.table.unify_inner_trivial(&derefed_ty, &to_ty, 0) { | 180 | } else if self.table.unify_inner_trivial(&derefed_ty, &to_ty, 0) { |
187 | return true; | 181 | return true; |
188 | } | 182 | } |