Skip to content

Commit 67f26f7

Browse files
authored
Auto merge of #37360 - jseyfried:fix_label_scope, r=nrc
resolve: fix label scopes Fixes #37353 (turns an ICE back into an error). r? @nrc
2 parents affc3b7 + dcdab2d commit 67f26f7

File tree

2 files changed

+16
-19
lines changed

2 files changed

+16
-19
lines changed

src/librustc_resolve/lib.rs

+13-19
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ use rustc::util::nodemap::{NodeMap, NodeSet, FnvHashMap, FnvHashSet};
5555

5656
use syntax::ext::hygiene::{Mark, SyntaxContext};
5757
use syntax::ast::{self, FloatTy};
58-
use syntax::ast::{CRATE_NODE_ID, Name, NodeId, Ident, IntTy, UintTy};
58+
use syntax::ast::{CRATE_NODE_ID, Name, NodeId, Ident, SpannedIdent, IntTy, UintTy};
5959
use syntax::ext::base::SyntaxExtension;
6060
use syntax::parse::token::{self, keywords};
6161
use syntax::util::lev_distance::find_best_match_for_name;
@@ -2278,7 +2278,7 @@ impl<'a> Resolver<'a> {
22782278
}
22792279

22802280
fn fresh_binding(&mut self,
2281-
ident: &ast::SpannedIdent,
2281+
ident: &SpannedIdent,
22822282
pat_id: NodeId,
22832283
outer_pat_id: NodeId,
22842284
pat_src: PatternSource,
@@ -2842,11 +2842,11 @@ impl<'a> Resolver<'a> {
28422842
} SuggestionType::NotFound
28432843
}
28442844

2845-
fn resolve_labeled_block(&mut self, label: Option<Ident>, id: NodeId, block: &Block) {
2845+
fn resolve_labeled_block(&mut self, label: Option<SpannedIdent>, id: NodeId, block: &Block) {
28462846
if let Some(label) = label {
28472847
let def = Def::Label(id);
28482848
self.with_label_rib(|this| {
2849-
this.label_ribs.last_mut().unwrap().bindings.insert(label, def);
2849+
this.label_ribs.last_mut().unwrap().bindings.insert(label.node, def);
28502850
this.visit_block(block);
28512851
});
28522852
} else {
@@ -3039,19 +3039,6 @@ impl<'a> Resolver<'a> {
30393039
visit::walk_expr(self, expr);
30403040
}
30413041

3042-
ExprKind::Loop(_, Some(label)) | ExprKind::While(.., Some(label)) => {
3043-
self.with_label_rib(|this| {
3044-
let def = Def::Label(expr.id);
3045-
3046-
{
3047-
let rib = this.label_ribs.last_mut().unwrap();
3048-
rib.bindings.insert(label.node, def);
3049-
}
3050-
3051-
visit::walk_expr(this, expr);
3052-
})
3053-
}
3054-
30553042
ExprKind::Break(Some(label)) | ExprKind::Continue(Some(label)) => {
30563043
match self.search_label(label.node) {
30573044
None => {
@@ -3081,12 +3068,19 @@ impl<'a> Resolver<'a> {
30813068
optional_else.as_ref().map(|expr| self.visit_expr(expr));
30823069
}
30833070

3071+
ExprKind::Loop(ref block, label) => self.resolve_labeled_block(label, expr.id, &block),
3072+
3073+
ExprKind::While(ref subexpression, ref block, label) => {
3074+
self.visit_expr(subexpression);
3075+
self.resolve_labeled_block(label, expr.id, &block);
3076+
}
3077+
30843078
ExprKind::WhileLet(ref pattern, ref subexpression, ref block, label) => {
30853079
self.visit_expr(subexpression);
30863080
self.value_ribs.push(Rib::new(NormalRibKind));
30873081
self.resolve_pattern(pattern, PatternSource::WhileLet, &mut FnvHashMap());
30883082

3089-
self.resolve_labeled_block(label.map(|l| l.node), expr.id, block);
3083+
self.resolve_labeled_block(label, expr.id, block);
30903084

30913085
self.value_ribs.pop();
30923086
}
@@ -3096,7 +3090,7 @@ impl<'a> Resolver<'a> {
30963090
self.value_ribs.push(Rib::new(NormalRibKind));
30973091
self.resolve_pattern(pattern, PatternSource::For, &mut FnvHashMap());
30983092

3099-
self.resolve_labeled_block(label.map(|l| l.node), expr.id, block);
3093+
self.resolve_labeled_block(label, expr.id, block);
31003094

31013095
self.value_ribs.pop();
31023096
}

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

+3
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)