From f491567fb30b0956b3a0a90ed43099953a3e732a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lauren=C8=9Biu=20Nicola?= Date: Wed, 2 Oct 2019 15:14:50 +0300 Subject: Handle divergence in type inference for blocks --- crates/ra_hir/src/ty/infer.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'crates/ra_hir/src/ty/infer.rs') 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> { tail: Option, expected: &Expectation, ) -> Ty { + let mut diverges = false; for stmt in statements { match stmt { Statement::Let { pat, type_ref, initializer } => { @@ -1623,16 +1624,23 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { self.infer_pat(*pat, &ty, BindingMode::default()); } Statement::Expr(expr) => { - self.infer_expr(*expr, &Expectation::none()); + if let ty_app!(TypeCtor::Never) = self.infer_expr(*expr, &Expectation::none()) { + diverges = true; + } } } } - if let Some(expr) = tail { + let ty = if let Some(expr) = tail { self.infer_expr_coerce(expr, expected) } else { self.coerce(&Ty::unit(), &expected.ty); Ty::unit() + }; + if diverges { + Ty::simple(TypeCtor::Never) + } else { + ty } } -- cgit v1.2.3