aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/ty/infer.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src/ty/infer.rs')
-rw-r--r--crates/ra_hir/src/ty/infer.rs12
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