aboutsummaryrefslogtreecommitdiff
path: root/crates/hir_ty/src/infer/expr.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/hir_ty/src/infer/expr.rs')
-rw-r--r--crates/hir_ty/src/infer/expr.rs28
1 files changed, 15 insertions, 13 deletions
diff --git a/crates/hir_ty/src/infer/expr.rs b/crates/hir_ty/src/infer/expr.rs
index 6eaccd9b4..f5782ab24 100644
--- a/crates/hir_ty/src/infer/expr.rs
+++ b/crates/hir_ty/src/infer/expr.rs
@@ -35,7 +35,7 @@ use super::{
35impl<'a> InferenceContext<'a> { 35impl<'a> InferenceContext<'a> {
36 pub(super) fn infer_expr(&mut self, tgt_expr: ExprId, expected: &Expectation) -> Ty { 36 pub(super) fn infer_expr(&mut self, tgt_expr: ExprId, expected: &Expectation) -> Ty {
37 let ty = self.infer_expr_inner(tgt_expr, expected); 37 let ty = self.infer_expr_inner(tgt_expr, expected);
38 if ty.is_never() { 38 if self.resolve_ty_shallow(&ty).is_never() {
39 // Any expression that produces a value of type `!` must have diverged 39 // Any expression that produces a value of type `!` must have diverged
40 self.diverges = Diverges::Always; 40 self.diverges = Diverges::Always;
41 } 41 }
@@ -46,7 +46,7 @@ impl<'a> InferenceContext<'a> {
46 TypeMismatch { expected: expected.ty.clone(), actual: ty.clone() }, 46 TypeMismatch { expected: expected.ty.clone(), actual: ty.clone() },
47 ); 47 );
48 } 48 }
49 self.resolve_ty_as_possible(ty) 49 ty
50 } 50 }
51 51
52 /// Infer type of expression with possibly implicit coerce to the expected type. 52 /// Infer type of expression with possibly implicit coerce to the expected type.
@@ -67,7 +67,7 @@ impl<'a> InferenceContext<'a> {
67 expected.ty.clone() 67 expected.ty.clone()
68 }; 68 };
69 69
70 self.resolve_ty_as_possible(ty) 70 ty
71 } 71 }
72 72
73 fn callable_sig_from_fn_trait(&mut self, ty: &Ty, num_args: usize) -> Option<(Vec<Ty>, Ty)> { 73 fn callable_sig_from_fn_trait(&mut self, ty: &Ty, num_args: usize) -> Option<(Vec<Ty>, Ty)> {
@@ -284,8 +284,7 @@ impl<'a> InferenceContext<'a> {
284 284
285 // Now go through the argument patterns 285 // Now go through the argument patterns
286 for (arg_pat, arg_ty) in args.iter().zip(sig_tys) { 286 for (arg_pat, arg_ty) in args.iter().zip(sig_tys) {
287 let resolved = self.resolve_ty_as_possible(arg_ty); 287 self.infer_pat(*arg_pat, &arg_ty, BindingMode::default());
288 self.infer_pat(*arg_pat, &resolved, BindingMode::default());
289 } 288 }
290 289
291 let prev_diverges = mem::replace(&mut self.diverges, Diverges::Maybe); 290 let prev_diverges = mem::replace(&mut self.diverges, Diverges::Maybe);
@@ -525,14 +524,14 @@ impl<'a> InferenceContext<'a> {
525 Expr::Ref { expr, rawness, mutability } => { 524 Expr::Ref { expr, rawness, mutability } => {
526 let mutability = lower_to_chalk_mutability(*mutability); 525 let mutability = lower_to_chalk_mutability(*mutability);
527 let expectation = if let Some((exp_inner, exp_rawness, exp_mutability)) = 526 let expectation = if let Some((exp_inner, exp_rawness, exp_mutability)) =
528 &expected.ty.as_reference_or_ptr() 527 &self.resolve_ty_shallow(&expected.ty).as_reference_or_ptr()
529 { 528 {
530 if *exp_mutability == Mutability::Mut && mutability == Mutability::Not { 529 if *exp_mutability == Mutability::Mut && mutability == Mutability::Not {
531 // FIXME: throw type error - expected mut reference but found shared ref, 530 // FIXME: record type error - expected mut reference but found shared ref,
532 // which cannot be coerced 531 // which cannot be coerced
533 } 532 }
534 if *exp_rawness == Rawness::Ref && *rawness == Rawness::RawPtr { 533 if *exp_rawness == Rawness::Ref && *rawness == Rawness::RawPtr {
535 // FIXME: throw type error - expected reference but found ptr, 534 // FIXME: record type error - expected reference but found ptr,
536 // which cannot be coerced 535 // which cannot be coerced
537 } 536 }
538 Expectation::rvalue_hint(Ty::clone(exp_inner)) 537 Expectation::rvalue_hint(Ty::clone(exp_inner))
@@ -559,6 +558,7 @@ impl<'a> InferenceContext<'a> {
559 } 558 }
560 Expr::UnaryOp { expr, op } => { 559 Expr::UnaryOp { expr, op } => {
561 let inner_ty = self.infer_expr_inner(*expr, &Expectation::none()); 560 let inner_ty = self.infer_expr_inner(*expr, &Expectation::none());
561 let inner_ty = self.resolve_ty_shallow(&inner_ty);
562 match op { 562 match op {
563 UnaryOp::Deref => match self.resolver.krate() { 563 UnaryOp::Deref => match self.resolver.krate() {
564 Some(krate) => { 564 Some(krate) => {
@@ -615,8 +615,10 @@ impl<'a> InferenceContext<'a> {
615 _ => Expectation::none(), 615 _ => Expectation::none(),
616 }; 616 };
617 let lhs_ty = self.infer_expr(*lhs, &lhs_expectation); 617 let lhs_ty = self.infer_expr(*lhs, &lhs_expectation);
618 let lhs_ty = self.resolve_ty_shallow(&lhs_ty);
618 let rhs_expectation = op::binary_op_rhs_expectation(*op, lhs_ty.clone()); 619 let rhs_expectation = op::binary_op_rhs_expectation(*op, lhs_ty.clone());
619 let rhs_ty = self.infer_expr(*rhs, &Expectation::has_type(rhs_expectation)); 620 let rhs_ty = self.infer_expr(*rhs, &Expectation::has_type(rhs_expectation));
621 let rhs_ty = self.resolve_ty_shallow(&rhs_ty);
620 622
621 let ret = op::binary_op_return_ty(*op, lhs_ty.clone(), rhs_ty.clone()); 623 let ret = op::binary_op_return_ty(*op, lhs_ty.clone(), rhs_ty.clone());
622 624
@@ -699,7 +701,7 @@ impl<'a> InferenceContext<'a> {
699 } 701 }
700 } 702 }
701 Expr::Tuple { exprs } => { 703 Expr::Tuple { exprs } => {
702 let mut tys = match expected.ty.kind(&Interner) { 704 let mut tys = match self.resolve_ty_shallow(&expected.ty).kind(&Interner) {
703 TyKind::Tuple(_, substs) => substs 705 TyKind::Tuple(_, substs) => substs
704 .iter(&Interner) 706 .iter(&Interner)
705 .map(|a| a.assert_ty_ref(&Interner).clone()) 707 .map(|a| a.assert_ty_ref(&Interner).clone())
@@ -716,7 +718,7 @@ impl<'a> InferenceContext<'a> {
716 TyKind::Tuple(tys.len(), Substitution::from_iter(&Interner, tys)).intern(&Interner) 718 TyKind::Tuple(tys.len(), Substitution::from_iter(&Interner, tys)).intern(&Interner)
717 } 719 }
718 Expr::Array(array) => { 720 Expr::Array(array) => {
719 let elem_ty = match expected.ty.kind(&Interner) { 721 let elem_ty = match self.resolve_ty_shallow(&expected.ty).kind(&Interner) {
720 TyKind::Array(st, _) | TyKind::Slice(st) => st.clone(), 722 TyKind::Array(st, _) | TyKind::Slice(st) => st.clone(),
721 _ => self.table.new_type_var(), 723 _ => self.table.new_type_var(),
722 }; 724 };
@@ -788,7 +790,6 @@ impl<'a> InferenceContext<'a> {
788 }; 790 };
789 // use a new type variable if we got unknown here 791 // use a new type variable if we got unknown here
790 let ty = self.insert_type_vars_shallow(ty); 792 let ty = self.insert_type_vars_shallow(ty);
791 let ty = self.resolve_ty_as_possible(ty);
792 self.write_expr_ty(tgt_expr, ty.clone()); 793 self.write_expr_ty(tgt_expr, ty.clone());
793 ty 794 ty
794 } 795 }
@@ -816,7 +817,6 @@ impl<'a> InferenceContext<'a> {
816 } 817 }
817 } 818 }
818 819
819 let ty = self.resolve_ty_as_possible(ty);
820 self.infer_pat(*pat, &ty, BindingMode::default()); 820 self.infer_pat(*pat, &ty, BindingMode::default());
821 } 821 }
822 Statement::Expr { expr, .. } => { 822 Statement::Expr { expr, .. } => {
@@ -894,7 +894,8 @@ impl<'a> InferenceContext<'a> {
894 }; 894 };
895 // Apply autoref so the below unification works correctly 895 // Apply autoref so the below unification works correctly
896 // FIXME: return correct autorefs from lookup_method 896 // FIXME: return correct autorefs from lookup_method
897 let actual_receiver_ty = match expected_receiver_ty.as_reference() { 897 let actual_receiver_ty = match self.resolve_ty_shallow(&expected_receiver_ty).as_reference()
898 {
898 Some((_, lifetime, mutability)) => { 899 Some((_, lifetime, mutability)) => {
899 TyKind::Ref(mutability, lifetime, derefed_receiver_ty).intern(&Interner) 900 TyKind::Ref(mutability, lifetime, derefed_receiver_ty).intern(&Interner)
900 } 901 }
@@ -974,6 +975,7 @@ impl<'a> InferenceContext<'a> {
974 } 975 }
975 976
976 fn register_obligations_for_call(&mut self, callable_ty: &Ty) { 977 fn register_obligations_for_call(&mut self, callable_ty: &Ty) {
978 let callable_ty = self.resolve_ty_shallow(&callable_ty);
977 if let TyKind::FnDef(fn_def, parameters) = callable_ty.kind(&Interner) { 979 if let TyKind::FnDef(fn_def, parameters) = callable_ty.kind(&Interner) {
978 let def: CallableDefId = from_chalk(self.db, *fn_def); 980 let def: CallableDefId = from_chalk(self.db, *fn_def);
979 let generic_predicates = self.db.generic_predicates(def.into()); 981 let generic_predicates = self.db.generic_predicates(def.into());