diff options
author | Florian Diebold <[email protected]> | 2019-12-20 17:27:51 +0000 |
---|---|---|
committer | Florian Diebold <[email protected]> | 2019-12-20 17:28:21 +0000 |
commit | 9c3f00a90651998c2cd4151f43f17cd92ef8eef1 (patch) | |
tree | 2b96a667cd1d7bee5ec41abe38d777bc181b674d /crates/ra_hir_ty | |
parent | 99d6f544f2a590d3feef47ce62d5cd9a8b463a47 (diff) |
Fix coercion of last expression in function body
Diffstat (limited to 'crates/ra_hir_ty')
-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#" |