Skip to content

Commit

Permalink
middle: reset loop labels while visiting closure
Browse files Browse the repository at this point in the history
This should fix rust-lang#31754 and follow-up rust-lang#25343.  Before the latter, the
closure was visited twice in the context of the enclosing fn, which
made even a single closure with a loop label emit a warning.

With this change, the closure is still visited within the context
of the main fn (which is intended, since it is not a separate item)
but resets the found loop labels while being visited.

Fixes: rust-lang#31754
  • Loading branch information
birkenfeld committed May 2, 2016
1 parent 855fb61 commit 6fed013
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 1 deletion.
7 changes: 6 additions & 1 deletion src/librustc/middle/resolve_lifetime.rs
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,12 @@ impl<'a, 'v> Visitor<'v> for LifetimeContext<'a> {
})
}
FnKind::Closure(_) => {
self.add_scope_and_walk_fn(fk, fd, b, s, fn_id)
// Closures have their own set of labels, save labels just
// like for foreign items above.
let saved = replace(&mut self.labels_in_fn, vec![]);
let result = self.add_scope_and_walk_fn(fk, fd, b, s, fn_id);
replace(&mut self.labels_in_fn, saved);
result
}
}
}
Expand Down
15 changes: 15 additions & 0 deletions src/test/run-pass/issue-25343.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,24 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#[allow(unused)]
fn main() {
|| {
'label: loop {
}
};

// More cases added from issue 31754

'label2: loop {
break;
}

let closure = || {
'label2: loop {}
};

fn inner_fn() {
'label2: loop {}
}
}

0 comments on commit 6fed013

Please sign in to comment.