Skip to content

Commit 947579e

Browse files
jseyfriedbrson
authored andcommitted
Fix label scopes.
1 parent 2d3a5d8 commit 947579e

File tree

2 files changed

+16
-19
lines changed

2 files changed

+16
-19
lines changed

src/librustc_resolve/lib.rs

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ use rustc::util::nodemap::{NodeMap, NodeSet, FnvHashMap, FnvHashSet};
5656
use syntax::ext::base::MultiItemModifier;
5757
use syntax::ext::hygiene::Mark;
5858
use syntax::ast::{self, FloatTy};
59-
use syntax::ast::{CRATE_NODE_ID, Name, NodeId, IntTy, UintTy};
59+
use syntax::ast::{CRATE_NODE_ID, Name, NodeId, SpannedIdent, IntTy, UintTy};
6060
use syntax::parse::token::{self, keywords};
6161
use syntax::util::lev_distance::find_best_match_for_name;
6262

@@ -2237,7 +2237,7 @@ impl<'a> Resolver<'a> {
22372237
}
22382238

22392239
fn fresh_binding(&mut self,
2240-
ident: &ast::SpannedIdent,
2240+
ident: &SpannedIdent,
22412241
pat_id: NodeId,
22422242
outer_pat_id: NodeId,
22432243
pat_src: PatternSource,
@@ -2803,11 +2803,11 @@ impl<'a> Resolver<'a> {
28032803
} SuggestionType::NotFound
28042804
}
28052805

2806-
fn resolve_labeled_block(&mut self, label: Option<ast::Ident>, id: NodeId, block: &Block) {
2806+
fn resolve_labeled_block(&mut self, label: Option<SpannedIdent>, id: NodeId, block: &Block) {
28072807
if let Some(label) = label {
28082808
let def = Def::Label(id);
28092809
self.with_label_rib(|this| {
2810-
this.label_ribs.last_mut().unwrap().bindings.insert(label, def);
2810+
this.label_ribs.last_mut().unwrap().bindings.insert(label.node, def);
28112811
this.visit_block(block);
28122812
});
28132813
} else {
@@ -3006,19 +3006,6 @@ impl<'a> Resolver<'a> {
30063006
visit::walk_expr(self, expr);
30073007
}
30083008

3009-
ExprKind::Loop(_, Some(label)) | ExprKind::While(.., Some(label)) => {
3010-
self.with_label_rib(|this| {
3011-
let def = Def::Label(expr.id);
3012-
3013-
{
3014-
let rib = this.label_ribs.last_mut().unwrap();
3015-
rib.bindings.insert(label.node, def);
3016-
}
3017-
3018-
visit::walk_expr(this, expr);
3019-
})
3020-
}
3021-
30223009
ExprKind::Break(Some(label)) | ExprKind::Continue(Some(label)) => {
30233010
match self.search_label(label.node) {
30243011
None => {
@@ -3048,12 +3035,19 @@ impl<'a> Resolver<'a> {
30483035
optional_else.as_ref().map(|expr| self.visit_expr(expr));
30493036
}
30503037

3038+
ExprKind::Loop(ref block, label) => self.resolve_labeled_block(label, expr.id, &block),
3039+
3040+
ExprKind::While(ref subexpression, ref block, label) => {
3041+
self.visit_expr(subexpression);
3042+
self.resolve_labeled_block(label, expr.id, &block);
3043+
}
3044+
30513045
ExprKind::WhileLet(ref pattern, ref subexpression, ref block, label) => {
30523046
self.visit_expr(subexpression);
30533047
self.value_ribs.push(Rib::new(NormalRibKind));
30543048
self.resolve_pattern(pattern, PatternSource::WhileLet, &mut FnvHashMap());
30553049

3056-
self.resolve_labeled_block(label.map(|l| l.node), expr.id, block);
3050+
self.resolve_labeled_block(label, expr.id, block);
30573051

30583052
self.value_ribs.pop();
30593053
}
@@ -3063,7 +3057,7 @@ impl<'a> Resolver<'a> {
30633057
self.value_ribs.push(Rib::new(NormalRibKind));
30643058
self.resolve_pattern(pattern, PatternSource::For, &mut FnvHashMap());
30653059

3066-
self.resolve_labeled_block(label.map(|l| l.node), expr.id, block);
3060+
self.resolve_labeled_block(label, expr.id, block);
30673061

30683062
self.value_ribs.pop();
30693063
}

src/test/compile-fail/resolve-label.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ fn f() {
1616
}
1717
}
1818
}
19+
20+
// issue #37353
21+
loop { 'w: while break 'w { } } //~ ERROR use of undeclared label
1922
}
2023

2124
fn main() {}

0 commit comments

Comments
 (0)