middle: reset loop labels while visiting closure

This should fix #31754 and follow-up #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: #31754
This commit is contained in:
Georg Brandl 2016-05-02 16:47:07 +02:00
parent 855fb61922
commit 6fed0132f3
2 changed files with 21 additions and 1 deletions

View file

@ -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
}
}
}

View file

@ -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 {}
}
}