aboutsummaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
Diffstat (limited to 'crates')
-rw-r--r--crates/hir_ty/src/infer.rs4
-rw-r--r--crates/hir_ty/src/infer/coerce.rs8
-rw-r--r--crates/hir_ty/src/infer/unify.rs9
3 files changed, 7 insertions, 14 deletions
diff --git a/crates/hir_ty/src/infer.rs b/crates/hir_ty/src/infer.rs
index 97e7c5f8c..8cfc84b86 100644
--- a/crates/hir_ty/src/infer.rs
+++ b/crates/hir_ty/src/infer.rs
@@ -13,8 +13,6 @@
13//! to certain types. To record this, we use the union-find implementation from 13//! to certain types. To record this, we use the union-find implementation from
14//! the `ena` crate, which is extracted from rustc. 14//! the `ena` crate, which is extracted from rustc.
15 15
16use std::borrow::Cow;
17
18use std::ops::Index; 16use std::ops::Index;
19use std::sync::Arc; 17use std::sync::Arc;
20 18
@@ -384,7 +382,7 @@ impl<'a> InferenceContext<'a> {
384 self.table.resolve_ty_as_possible(ty) 382 self.table.resolve_ty_as_possible(ty)
385 } 383 }
386 384
387 fn resolve_ty_shallow<'b>(&mut self, ty: &'b Ty) -> Cow<'b, Ty> { 385 fn resolve_ty_shallow(&mut self, ty: &Ty) -> Ty {
388 self.table.resolve_ty_shallow(ty) 386 self.table.resolve_ty_shallow(ty)
389 } 387 }
390 388
diff --git a/crates/hir_ty/src/infer/coerce.rs b/crates/hir_ty/src/infer/coerce.rs
index 911343cb9..c85c088f7 100644
--- a/crates/hir_ty/src/infer/coerce.rs
+++ b/crates/hir_ty/src/infer/coerce.rs
@@ -23,7 +23,7 @@ impl<'a> InferenceContext<'a> {
23 if to_ty.is_unknown() { 23 if to_ty.is_unknown() {
24 return true; 24 return true;
25 } 25 }
26 let from_ty = self.resolve_ty_shallow(from_ty).into_owned(); 26 let from_ty = self.resolve_ty_shallow(from_ty);
27 let to_ty = self.resolve_ty_shallow(to_ty); 27 let to_ty = self.resolve_ty_shallow(to_ty);
28 match self.coerce_inner(from_ty, &to_ty) { 28 match self.coerce_inner(from_ty, &to_ty) {
29 Ok(_result) => { 29 Ok(_result) => {
@@ -46,9 +46,7 @@ impl<'a> InferenceContext<'a> {
46 /// least upper bound. 46 /// least upper bound.
47 pub(super) fn coerce_merge_branch(&mut self, ty1: &Ty, ty2: &Ty) -> Ty { 47 pub(super) fn coerce_merge_branch(&mut self, ty1: &Ty, ty2: &Ty) -> Ty {
48 let ty1 = self.resolve_ty_shallow(ty1); 48 let ty1 = self.resolve_ty_shallow(ty1);
49 let ty1 = ty1.as_ref();
50 let ty2 = self.resolve_ty_shallow(ty2); 49 let ty2 = self.resolve_ty_shallow(ty2);
51 let ty2 = ty2.as_ref();
52 // Special case: two function types. Try to coerce both to 50 // Special case: two function types. Try to coerce both to
53 // pointers to have a chance at getting a match. See 51 // pointers to have a chance at getting a match. See
54 // https://github.com/rust-lang/rust/blob/7b805396bf46dce972692a6846ce2ad8481c5f85/src/librustc_typeck/check/coercion.rs#L877-L916 52 // https://github.com/rust-lang/rust/blob/7b805396bf46dce972692a6846ce2ad8481c5f85/src/librustc_typeck/check/coercion.rs#L877-L916
@@ -80,9 +78,9 @@ impl<'a> InferenceContext<'a> {
80 // type is a type variable and the new one is `!`, trying it the other 78 // type is a type variable and the new one is `!`, trying it the other
81 // way around first would mean we make the type variable `!`, instead of 79 // way around first would mean we make the type variable `!`, instead of
82 // just marking it as possibly diverging. 80 // just marking it as possibly diverging.
83 if self.coerce(ty2, ty1) { 81 if self.coerce(&ty2, &ty1) {
84 ty1.clone() 82 ty1.clone()
85 } else if self.coerce(ty1, ty2) { 83 } else if self.coerce(&ty1, &ty2) {
86 ty2.clone() 84 ty2.clone()
87 } else { 85 } else {
88 // TODO record a type mismatch 86 // TODO record a type mismatch
diff --git a/crates/hir_ty/src/infer/unify.rs b/crates/hir_ty/src/infer/unify.rs
index 75e04e8b5..278127c69 100644
--- a/crates/hir_ty/src/infer/unify.rs
+++ b/crates/hir_ty/src/infer/unify.rs
@@ -1,6 +1,6 @@
1//! Unification and canonicalization logic. 1//! Unification and canonicalization logic.
2 2
3use std::{borrow::Cow, fmt, mem, sync::Arc}; 3use std::{fmt, mem, sync::Arc};
4 4
5use chalk_ir::{ 5use chalk_ir::{
6 cast::Cast, fold::Fold, interner::HasInterner, zip::Zip, FloatTy, IntTy, TyVariableKind, 6 cast::Cast, fold::Fold, interner::HasInterner, zip::Zip, FloatTy, IntTy, TyVariableKind,
@@ -340,11 +340,8 @@ impl<'a> InferenceTable<'a> {
340 340
341 /// If `ty` is a type variable with known type, returns that type; 341 /// If `ty` is a type variable with known type, returns that type;
342 /// otherwise, return ty. 342 /// otherwise, return ty.
343 // FIXME this could probably just return Ty 343 pub(crate) fn resolve_ty_shallow(&mut self, ty: &Ty) -> Ty {
344 pub(crate) fn resolve_ty_shallow<'b>(&mut self, ty: &'b Ty) -> Cow<'b, Ty> { 344 self.var_unification_table.normalize_ty_shallow(&Interner, ty).unwrap_or_else(|| ty.clone())
345 self.var_unification_table
346 .normalize_ty_shallow(&Interner, ty)
347 .map_or(Cow::Borrowed(ty), Cow::Owned)
348 } 345 }
349 346
350 /// Resolves the type as far as currently possible, replacing type variables 347 /// Resolves the type as far as currently possible, replacing type variables