diff options
Diffstat (limited to 'crates/ra_hir/src/ty/infer.rs')
-rw-r--r-- | crates/ra_hir/src/ty/infer.rs | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/crates/ra_hir/src/ty/infer.rs b/crates/ra_hir/src/ty/infer.rs index 2e4a489a0..ca9aefc42 100644 --- a/crates/ra_hir/src/ty/infer.rs +++ b/crates/ra_hir/src/ty/infer.rs | |||
@@ -1602,6 +1602,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
1602 | tail: Option<ExprId>, | 1602 | tail: Option<ExprId>, |
1603 | expected: &Expectation, | 1603 | expected: &Expectation, |
1604 | ) -> Ty { | 1604 | ) -> Ty { |
1605 | let mut diverges = false; | ||
1605 | for stmt in statements { | 1606 | for stmt in statements { |
1606 | match stmt { | 1607 | match stmt { |
1607 | Statement::Let { pat, type_ref, initializer } => { | 1608 | Statement::Let { pat, type_ref, initializer } => { |
@@ -1623,16 +1624,23 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
1623 | self.infer_pat(*pat, &ty, BindingMode::default()); | 1624 | self.infer_pat(*pat, &ty, BindingMode::default()); |
1624 | } | 1625 | } |
1625 | Statement::Expr(expr) => { | 1626 | Statement::Expr(expr) => { |
1626 | self.infer_expr(*expr, &Expectation::none()); | 1627 | if let ty_app!(TypeCtor::Never) = self.infer_expr(*expr, &Expectation::none()) { |
1628 | diverges = true; | ||
1629 | } | ||
1627 | } | 1630 | } |
1628 | } | 1631 | } |
1629 | } | 1632 | } |
1630 | 1633 | ||
1631 | if let Some(expr) = tail { | 1634 | let ty = if let Some(expr) = tail { |
1632 | self.infer_expr_coerce(expr, expected) | 1635 | self.infer_expr_coerce(expr, expected) |
1633 | } else { | 1636 | } else { |
1634 | self.coerce(&Ty::unit(), &expected.ty); | 1637 | self.coerce(&Ty::unit(), &expected.ty); |
1635 | Ty::unit() | 1638 | Ty::unit() |
1639 | }; | ||
1640 | if diverges { | ||
1641 | Ty::simple(TypeCtor::Never) | ||
1642 | } else { | ||
1643 | ty | ||
1636 | } | 1644 | } |
1637 | } | 1645 | } |
1638 | 1646 | ||