Skip to content

Commit c5ddc35

Browse files
Merge #9886
9886: feat: type inference for if-let guards r=jonas-schievink a=jonas-schievink This turned out fairly simple bors r+ Co-authored-by: Jonas Schievink <jonasschievink@gmail.com>
2 parents 0d54081 + 4757679 commit c5ddc35

File tree

2 files changed

+31
-6
lines changed

2 files changed

+31
-6
lines changed

crates/hir_ty/src/infer/expr.rs

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -366,13 +366,21 @@ impl<'a> InferenceContext<'a> {
366366
for arm in arms {
367367
self.diverges = Diverges::Maybe;
368368
let _pat_ty = self.infer_pat(arm.pat, &input_ty, BindingMode::default());
369-
if let Some(MatchGuard::If { expr: guard_expr }) = arm.guard {
370-
self.infer_expr(
371-
guard_expr,
372-
&Expectation::has_type(TyKind::Scalar(Scalar::Bool).intern(&Interner)),
373-
);
369+
match arm.guard {
370+
Some(MatchGuard::If { expr: guard_expr }) => {
371+
self.infer_expr(
372+
guard_expr,
373+
&Expectation::has_type(
374+
TyKind::Scalar(Scalar::Bool).intern(&Interner),
375+
),
376+
);
377+
}
378+
Some(MatchGuard::IfLet { expr, pat }) => {
379+
let input_ty = self.infer_expr(expr, &Expectation::none());
380+
let _pat_ty = self.infer_pat(pat, &input_ty, BindingMode::default());
381+
}
382+
_ => {}
374383
}
375-
// FIXME: infer `if let` guard
376384

377385
let arm_ty = self.infer_expr_inner(arm.expr, &expected);
378386
all_arms_diverge &= self.diverges;

crates/hir_ty/src/tests/patterns.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -916,3 +916,20 @@ fn main() {
916916
"#,
917917
);
918918
}
919+
920+
#[test]
921+
fn if_let_guards() {
922+
check_types(
923+
r#"
924+
fn main() {
925+
match (0,) {
926+
opt if let (x,) = opt => {
927+
x;
928+
//^ i32
929+
}
930+
_ => {}
931+
}
932+
}
933+
"#,
934+
);
935+
}

0 commit comments

Comments
 (0)