diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2021-02-10 15:59:49 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2021-02-10 15:59:49 +0000 |
commit | 7ec03439a89943e46a22fa3c158eb7fffb205666 (patch) | |
tree | 2a9098516877f68242a6d8c7c8fb8bbfd615e19e /crates/hir_ty/src/infer/expr.rs | |
parent | 82a1b91f205ac9c3d397b2bea033639f5df9e6b6 (diff) | |
parent | 3c5734712a074a5bb3100dbec8b690e60b5beac0 (diff) |
Merge #7627
7627: infer: update resolver when descending into block r=jonas-schievink a=jonas-schievink
Co-authored-by: Jonas Schievink <[email protected]>
Diffstat (limited to 'crates/hir_ty/src/infer/expr.rs')
-rw-r--r-- | crates/hir_ty/src/infer/expr.rs | 43 |
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); |