commit
4dacf2780f
2 changed files with 45 additions and 2 deletions
|
|
@ -4008,6 +4008,8 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
/// Searches the current set of local scopes and
|
||||
/// applies translations for closures.
|
||||
fn search_ribs(&self,
|
||||
ribs: &[Rib],
|
||||
name: Name,
|
||||
|
|
@ -4029,6 +4031,27 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
|
|||
None
|
||||
}
|
||||
|
||||
/// Searches the current set of local scopes for labels.
|
||||
/// Stops after meeting a closure.
|
||||
fn search_label(&self, name: Name) -> Option<DefLike> {
|
||||
for rib in self.label_ribs.iter().rev() {
|
||||
match rib.kind {
|
||||
NormalRibKind => {
|
||||
// Continue
|
||||
}
|
||||
_ => {
|
||||
// Do not resolve labels across function boundary
|
||||
return None
|
||||
}
|
||||
}
|
||||
let result = rib.bindings.get(&name).cloned();
|
||||
if result.is_some() {
|
||||
return result
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
|
||||
fn resolve_crate(&mut self, krate: &ast::Crate) {
|
||||
debug!("(resolving crate) starting");
|
||||
|
||||
|
|
@ -5835,8 +5858,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
|
|||
|
||||
ExprBreak(Some(label)) | ExprAgain(Some(label)) => {
|
||||
let renamed = mtwt::resolve(label);
|
||||
match self.search_ribs(self.label_ribs[],
|
||||
renamed, expr.span) {
|
||||
match self.search_label(renamed) {
|
||||
None => {
|
||||
self.resolve_error(
|
||||
expr.span,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue