aboutsummaryrefslogtreecommitdiff
path: root/crates/hir_ty/src/infer
diff options
context:
space:
mode:
Diffstat (limited to 'crates/hir_ty/src/infer')
-rw-r--r--crates/hir_ty/src/infer/expr.rs43
1 files changed, 26 insertions, 17 deletions
diff --git a/crates/hir_ty/src/infer/expr.rs b/crates/hir_ty/src/infer/expr.rs
index 12f1591c8..cb59a6937 100644
--- a/crates/hir_ty/src/infer/expr.rs
+++ b/crates/hir_ty/src/infer/expr.rs
@@ -137,24 +137,33 @@ 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 let old_resolver = mem::replace(
142 let break_ty = self.table.new_type_var(); 142 &mut self.resolver,
143 self.breakables.push(BreakableContext { 143 resolver_for_expr(self.db.upcast(), self.owner, tgt_expr),
144 may_break: false, 144 );
145 break_ty: break_ty.clone(), 145 let ty = match label {
146 label: label.map(|label| self.body[label].name.clone()), 146 Some(_) => {
147 }); 147 let break_ty = self.table.new_type_var();
148 let ty = self.infer_block(statements, *tail, &Expectation::has_type(break_ty)); 148 self.breakables.push(BreakableContext {
149 let ctxt = self.breakables.pop().expect("breakable stack broken"); 149 may_break: false,
150 if ctxt.may_break { 150 break_ty: break_ty.clone(),
151 ctxt.break_ty 151 label: label.map(|label| self.body[label].name.clone()),
152 } else { 152 });
153 ty 153 let ty =
154 self.infer_block(statements, *tail, &Expectation::has_type(break_ty));
155 let ctxt = self.breakables.pop().expect("breakable stack broken");
156 if ctxt.may_break {
157 ctxt.break_ty
158 } else {
159 ty
160 }
154 } 161 }
155 } 162 None => self.infer_block(statements, *tail, expected),
156 None => self.infer_block(statements, *tail, expected), 163 };
157 }, 164 self.resolver = old_resolver;
165 ty
166 }
158 Expr::Unsafe { body } | Expr::Const { body } => self.infer_expr(*body, expected), 167 Expr::Unsafe { body } | Expr::Const { body } => self.infer_expr(*body, expected),
159 Expr::TryBlock { body } => { 168 Expr::TryBlock { body } => {
160 let _inner = self.infer_expr(*body, expected); 169 let _inner = self.infer_expr(*body, expected);