Skip to content

Commit

Permalink
Include the MacroDefinition rib in the label ribs.
Browse files Browse the repository at this point in the history
  • Loading branch information
jseyfried committed Jul 15, 2016
1 parent 56c4ddf commit c83e31e
Showing 1 changed file with 16 additions and 4 deletions.
20 changes: 16 additions & 4 deletions src/librustc_resolve/lib.rs
Expand Up @@ -1576,12 +1576,21 @@ impl<'a> Resolver<'a> {

/// Searches the current set of local scopes for labels.
/// Stops after meeting a closure.
fn search_label(&self, ident: ast::Ident) -> Option<Def> {
fn search_label(&self, mut ident: ast::Ident) -> Option<Def> {
for rib in self.label_ribs.iter().rev() {
match rib.kind {
NormalRibKind => {
// Continue
}
MacroDefinition(mac) => {
// If an invocation of this macro created `ident`, give up on `ident`
// and switch to `ident`'s source from the macro definition.
if let Some((source_ident, source_macro)) = mtwt::source(ident) {
if mac == source_macro {
ident = source_ident;
}
}
}
_ => {
// Do not resolve labels across function boundary
return None;
Expand Down Expand Up @@ -2088,7 +2097,7 @@ impl<'a> Resolver<'a> {
let orig_module = self.current_module;
let anonymous_module = self.module_map.get(&block.id).cloned(); // clones a reference

let mut num_value_ribs = 1;
let mut num_macro_definition_ribs = 0;
if let Some(anonymous_module) = anonymous_module {
debug!("(resolving block) found anonymous module, moving down");
self.value_ribs.push(Rib::new(ModuleRibKind(anonymous_module)));
Expand All @@ -2101,9 +2110,10 @@ impl<'a> Resolver<'a> {
// Descend into the block.
for stmt in &block.stmts {
if let Some(marks) = self.macros_at_scope.remove(&stmt.id) {
num_value_ribs += marks.len() as u32;
num_macro_definition_ribs += marks.len() as u32;
for mark in marks {
self.value_ribs.push(Rib::new(MacroDefinition(mark)));
self.label_ribs.push(Rib::new(MacroDefinition(mark)));
}
}

Expand All @@ -2112,9 +2122,11 @@ impl<'a> Resolver<'a> {

// Move back up.
self.current_module = orig_module;
for _ in 0 .. num_value_ribs {
for _ in 0 .. num_macro_definition_ribs {
self.value_ribs.pop();
self.label_ribs.pop();
}
self.value_ribs.pop();
if let Some(_) = anonymous_module {
self.type_ribs.pop();
}
Expand Down

0 comments on commit c83e31e

Please sign in to comment.