aboutsummaryrefslogtreecommitdiff
path: root/crates/hir_ty/src/infer/expr.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/hir_ty/src/infer/expr.rs')
-rw-r--r--crates/hir_ty/src/infer/expr.rs36
1 files changed, 20 insertions, 16 deletions
diff --git a/crates/hir_ty/src/infer/expr.rs b/crates/hir_ty/src/infer/expr.rs
index 12f1591c8..d05c715e7 100644
--- a/crates/hir_ty/src/infer/expr.rs
+++ b/crates/hir_ty/src/infer/expr.rs
@@ -137,24 +137,28 @@ impl<'a> InferenceContext<'a> {
137 137
138 self.coerce_merge_branch(&then_ty, &else_ty) 138 self.coerce_merge_branch(&then_ty, &else_ty)
139 } 139 }
140 Expr::Block { statements, tail, label, id: _ } => match label { 140 Expr::Block { statements, tail, label, id: _ } => {
141 Some(_) => { 141 self.resolver = resolver_for_expr(self.db.upcast(), self.owner, tgt_expr);
142 let break_ty = self.table.new_type_var(); 142 match label {
143 self.breakables.push(BreakableContext { 143 Some(_) => {
144 may_break: false, 144 let break_ty = self.table.new_type_var();
145 break_ty: break_ty.clone(), 145 self.breakables.push(BreakableContext {
146 label: label.map(|label| self.body[label].name.clone()), 146 may_break: false,
147 }); 147 break_ty: break_ty.clone(),
148 let ty = self.infer_block(statements, *tail, &Expectation::has_type(break_ty)); 148 label: label.map(|label| self.body[label].name.clone()),
149 let ctxt = self.breakables.pop().expect("breakable stack broken"); 149 });
150 if ctxt.may_break { 150 let ty =
151 ctxt.break_ty 151 self.infer_block(statements, *tail, &Expectation::has_type(break_ty));
152 } else { 152 let ctxt = self.breakables.pop().expect("breakable stack broken");
153 ty 153 if ctxt.may_break {
154 ctxt.break_ty
155 } else {
156 ty
157 }
154 } 158 }
159 None => self.infer_block(statements, *tail, expected),
155 } 160 }
156 None => self.infer_block(statements, *tail, expected), 161 }
157 },
158 Expr::Unsafe { body } | Expr::Const { body } => self.infer_expr(*body, expected), 162 Expr::Unsafe { body } | Expr::Const { body } => self.infer_expr(*body, expected),
159 Expr::TryBlock { body } => { 163 Expr::TryBlock { body } => {
160 let _inner = self.infer_expr(*body, expected); 164 let _inner = self.infer_expr(*body, expected);