diff options
Diffstat (limited to 'crates/ra_hir_ty/src')
| -rw-r--r-- | crates/ra_hir_ty/src/infer.rs | 2 | ||||
| -rw-r--r-- | crates/ra_hir_ty/src/infer/expr.rs | 2 | ||||
| -rw-r--r-- | crates/ra_hir_ty/src/tests/coercion.rs | 16 |
3 files changed, 18 insertions, 2 deletions
diff --git a/crates/ra_hir_ty/src/infer.rs b/crates/ra_hir_ty/src/infer.rs index 9f2ed830e..e97b81473 100644 --- a/crates/ra_hir_ty/src/infer.rs +++ b/crates/ra_hir_ty/src/infer.rs | |||
| @@ -460,7 +460,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
| 460 | } | 460 | } |
| 461 | 461 | ||
| 462 | fn infer_body(&mut self) { | 462 | fn infer_body(&mut self) { |
| 463 | self.infer_expr(self.body.body_expr, &Expectation::has_type(self.return_ty.clone())); | 463 | self.infer_expr_coerce(self.body.body_expr, &Expectation::has_type(self.return_ty.clone())); |
| 464 | } | 464 | } |
| 465 | 465 | ||
| 466 | fn resolve_into_iter_item(&self) -> Option<TypeAliasId> { | 466 | fn resolve_into_iter_item(&self) -> Option<TypeAliasId> { |
diff --git a/crates/ra_hir_ty/src/infer/expr.rs b/crates/ra_hir_ty/src/infer/expr.rs index 253332c30..3af05394c 100644 --- a/crates/ra_hir_ty/src/infer/expr.rs +++ b/crates/ra_hir_ty/src/infer/expr.rs | |||
| @@ -41,7 +41,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
| 41 | 41 | ||
| 42 | /// Infer type of expression with possibly implicit coerce to the expected type. | 42 | /// Infer type of expression with possibly implicit coerce to the expected type. |
| 43 | /// Return the type after possible coercion. | 43 | /// Return the type after possible coercion. |
| 44 | fn infer_expr_coerce(&mut self, expr: ExprId, expected: &Expectation) -> Ty { | 44 | pub(super) fn infer_expr_coerce(&mut self, expr: ExprId, expected: &Expectation) -> Ty { |
| 45 | let ty = self.infer_expr_inner(expr, &expected); | 45 | let ty = self.infer_expr_inner(expr, &expected); |
| 46 | let ty = if !self.coerce(&ty, &expected.ty) { | 46 | let ty = if !self.coerce(&ty, &expected.ty) { |
| 47 | self.result | 47 | self.result |
diff --git a/crates/ra_hir_ty/src/tests/coercion.rs b/crates/ra_hir_ty/src/tests/coercion.rs index 33d6ca403..793c23e41 100644 --- a/crates/ra_hir_ty/src/tests/coercion.rs +++ b/crates/ra_hir_ty/src/tests/coercion.rs | |||
| @@ -370,6 +370,22 @@ fn test() { | |||
| 370 | } | 370 | } |
| 371 | 371 | ||
| 372 | #[test] | 372 | #[test] |
| 373 | fn return_coerce_unknown() { | ||
| 374 | assert_snapshot!( | ||
| 375 | infer_with_mismatches(r#" | ||
| 376 | fn foo() -> u32 { | ||
| 377 | return unknown; | ||
| 378 | } | ||
| 379 | "#, true), | ||
| 380 | @r###" | ||
| 381 | [17; 40) '{ ...own; }': ! | ||
| 382 | [23; 37) 'return unknown': ! | ||
| 383 | [30; 37) 'unknown': u32 | ||
| 384 | "### | ||
| 385 | ); | ||
| 386 | } | ||
| 387 | |||
| 388 | #[test] | ||
| 373 | fn coerce_autoderef() { | 389 | fn coerce_autoderef() { |
| 374 | assert_snapshot!( | 390 | assert_snapshot!( |
| 375 | infer_with_mismatches(r#" | 391 | infer_with_mismatches(r#" |
