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:
parent
855fb61922
commit
6fed0132f3
2 changed files with 21 additions and 1 deletions
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue