diff options
Diffstat (limited to 'crates/hir_ty/src/infer/expr.rs')
-rw-r--r-- | crates/hir_ty/src/infer/expr.rs | 28 |
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::{ | |||
35 | impl<'a> InferenceContext<'a> { | 35 | impl<'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()); |