From 43df7c3d53198e8ae3509035eb5273d8a94f758b Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Tue, 11 Feb 2020 21:07:18 +0100 Subject: [PATCH] Don't let unknown match arms fall back to ! --- crates/ra_hir_ty/src/infer/expr.rs | 6 +++++- crates/ra_hir_ty/src/tests/never_type.rs | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/crates/ra_hir_ty/src/infer/expr.rs b/crates/ra_hir_ty/src/infer/expr.rs index 186857b8b2..39d8bc0ca4 100644 --- a/crates/ra_hir_ty/src/infer/expr.rs +++ b/crates/ra_hir_ty/src/infer/expr.rs @@ -165,7 +165,11 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { Expr::Match { expr, arms } => { let input_ty = self.infer_expr(*expr, &Expectation::none()); - let mut result_ty = self.table.new_maybe_never_type_var(); + let mut result_ty = if arms.len() == 0 { + Ty::simple(TypeCtor::Never) + } else { + self.table.new_type_var() + }; for arm in arms { let _pat_ty = self.infer_pat(arm.pat, &input_ty, BindingMode::default()); diff --git a/crates/ra_hir_ty/src/tests/never_type.rs b/crates/ra_hir_ty/src/tests/never_type.rs index c202f545a3..a772094804 100644 --- a/crates/ra_hir_ty/src/tests/never_type.rs +++ b/crates/ra_hir_ty/src/tests/never_type.rs @@ -101,6 +101,7 @@ fn test() { ); assert_eq!(t, "Option"); } + #[test] fn never_type_can_be_reinferred3() { let t = type_at( @@ -137,6 +138,22 @@ fn test(a: Void) { assert_eq!(t, "!"); } +#[test] +fn match_unknown_arm() { + let t = type_at( + r#" +//- /main.rs +fn test(a: Option) { + let t = match 0 { + _ => unknown, + }; + t<|>; +} +"#, + ); + assert_eq!(t, "{unknown}"); +} + #[test] fn if_never() { let t = type_at(