diff options
| author | Eduard-Mihai Burtescu <edy.burt@gmail.com> | 2017-02-25 14:13:16 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-02-25 14:13:16 +0200 |
| commit | ad9079bae4250b2f9e99162d3ea14a1a90201a81 (patch) | |
| tree | d7d2ed53aa3e039be338db3fd9087c9dc835c2b3 /src/librustc_resolve | |
| parent | 46fed6e6fa7a5dc2605eb1f0e2652e90e316e517 (diff) | |
| parent | 6f0447b52bdbe1bc54902816078f3dbef4426515 (diff) | |
| download | rust-ad9079bae4250b2f9e99162d3ea14a1a90201a81.tar.gz rust-ad9079bae4250b2f9e99162d3ea14a1a90201a81.zip | |
Rollup merge of #39864 - cramertj:normalize-breaks, r=nikomatsakis
Normalize labeled and unlabeled breaks Part of #39849.
Diffstat (limited to 'src/librustc_resolve')
| -rw-r--r-- | src/librustc_resolve/lib.rs | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index c9e870188aa..2c073d45bff 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -2768,18 +2768,24 @@ impl<'a> Resolver<'a> { } } - fn resolve_labeled_block(&mut self, label: Option<SpannedIdent>, id: NodeId, block: &Block) { + fn with_resolved_label<F>(&mut self, label: Option<SpannedIdent>, id: NodeId, f: F) + where F: FnOnce(&mut Resolver) + { if let Some(label) = label { let def = Def::Label(id); self.with_label_rib(|this| { this.label_ribs.last_mut().unwrap().bindings.insert(label.node, def); - this.visit_block(block); + f(this); }); } else { - self.visit_block(block); + f(self); } } + fn resolve_labeled_block(&mut self, label: Option<SpannedIdent>, id: NodeId, block: &Block) { + self.with_resolved_label(label, id, |this| this.visit_block(block)); + } + fn resolve_expr(&mut self, expr: &Expr, parent: Option<&ExprKind>) { // First, record candidate traits for this expression if it could // result in the invocation of a method call. @@ -2833,18 +2839,18 @@ impl<'a> Resolver<'a> { ExprKind::Loop(ref block, label) => self.resolve_labeled_block(label, expr.id, &block), ExprKind::While(ref subexpression, ref block, label) => { - self.visit_expr(subexpression); - self.resolve_labeled_block(label, expr.id, &block); + self.with_resolved_label(label, expr.id, |this| { + this.visit_expr(subexpression); + this.visit_block(block); + }); } ExprKind::WhileLet(ref pattern, ref subexpression, ref block, label) => { - self.visit_expr(subexpression); - self.ribs[ValueNS].push(Rib::new(NormalRibKind)); - self.resolve_pattern(pattern, PatternSource::WhileLet, &mut FxHashMap()); - - self.resolve_labeled_block(label, expr.id, block); - - self.ribs[ValueNS].pop(); + self.with_resolved_label(label, expr.id, |this| { + this.visit_expr(subexpression); + this.resolve_pattern(pattern, PatternSource::WhileLet, &mut FxHashMap()); + this.visit_block(block); + }); } ExprKind::ForLoop(ref pattern, ref subexpression, ref block, label) => { |
