Skip to content

Commit 6f685df

Browse files
Merge #3114
3114: Don't let unknown match arms fall back to ! r=kjeremy a=flodiebold Co-authored-by: Florian Diebold <[email protected]>
2 parents 00e672a + 43df7c3 commit 6f685df

File tree

2 files changed

+22
-1
lines changed

2 files changed

+22
-1
lines changed

crates/ra_hir_ty/src/infer/expr.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,11 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
165165
Expr::Match { expr, arms } => {
166166
let input_ty = self.infer_expr(*expr, &Expectation::none());
167167

168-
let mut result_ty = self.table.new_maybe_never_type_var();
168+
let mut result_ty = if arms.len() == 0 {
169+
Ty::simple(TypeCtor::Never)
170+
} else {
171+
self.table.new_type_var()
172+
};
169173

170174
for arm in arms {
171175
let _pat_ty = self.infer_pat(arm.pat, &input_ty, BindingMode::default());

crates/ra_hir_ty/src/tests/never_type.rs

+17
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ fn test() {
101101
);
102102
assert_eq!(t, "Option<i32>");
103103
}
104+
104105
#[test]
105106
fn never_type_can_be_reinferred3() {
106107
let t = type_at(
@@ -137,6 +138,22 @@ fn test(a: Void) {
137138
assert_eq!(t, "!");
138139
}
139140

141+
#[test]
142+
fn match_unknown_arm() {
143+
let t = type_at(
144+
r#"
145+
//- /main.rs
146+
fn test(a: Option) {
147+
let t = match 0 {
148+
_ => unknown,
149+
};
150+
t<|>;
151+
}
152+
"#,
153+
);
154+
assert_eq!(t, "{unknown}");
155+
}
156+
140157
#[test]
141158
fn if_never() {
142159
let t = type_at(

0 commit comments

Comments
 (0)