From fe1e324694425e9b683b72be5371a555601ffe6c Mon Sep 17 00:00:00 2001 From: Chayim Refael Friedman Date: Sun, 23 Jan 2022 05:59:35 +0200 Subject: [PATCH] Type-inference for `let` expressions --- crates/hir_ty/src/infer/expr.rs | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/crates/hir_ty/src/infer/expr.rs b/crates/hir_ty/src/infer/expr.rs index 4f1bdee705d..13f64d68252 100644 --- a/crates/hir_ty/src/infer/expr.rs +++ b/crates/hir_ty/src/infer/expr.rs @@ -8,10 +8,7 @@ use std::{ use chalk_ir::{cast::Cast, fold::Shift, Mutability, TyVariableKind}; use hir_def::{ - expr::{ - ArithOp, Array, BinaryOp, CmpOp, Expr, ExprId, Literal, MatchGuard, Ordering, Statement, - UnaryOp, - }, + expr::{ArithOp, Array, BinaryOp, CmpOp, Expr, ExprId, Literal, Ordering, Statement, UnaryOp}, path::{GenericArg, GenericArgs}, resolver::resolver_for_expr, FieldId, FunctionId, ItemContainerId, Lookup, @@ -158,6 +155,11 @@ impl<'a> InferenceContext<'a> { coerce.complete() } + &Expr::Let { pat, expr } => { + let input_ty = self.infer_expr(expr, &Expectation::none()); + self.infer_pat(pat, &input_ty, BindingMode::default()); + TyKind::Scalar(Scalar::Bool).intern(Interner) + } Expr::Block { statements, tail, label, id: _ } => { let old_resolver = mem::replace( &mut self.resolver, @@ -378,20 +380,11 @@ impl<'a> InferenceContext<'a> { for arm in arms.iter() { self.diverges = Diverges::Maybe; let _pat_ty = self.infer_pat(arm.pat, &input_ty, BindingMode::default()); - match arm.guard { - Some(MatchGuard::If { expr: guard_expr }) => { - self.infer_expr( - guard_expr, - &Expectation::has_type( - TyKind::Scalar(Scalar::Bool).intern(Interner), - ), - ); - } - Some(MatchGuard::IfLet { expr, pat }) => { - let input_ty = self.infer_expr(expr, &Expectation::none()); - let _pat_ty = self.infer_pat(pat, &input_ty, BindingMode::default()); - } - _ => {} + if let Some(guard_expr) = arm.guard { + self.infer_expr( + guard_expr, + &Expectation::has_type(TyKind::Scalar(Scalar::Bool).intern(Interner)), + ); } let arm_ty = self.infer_expr_inner(arm.expr, &expected);