Skip to content

Commit

Permalink
in region, treat current (and future) item-likes alike
Browse files Browse the repository at this point in the history
The `visit_fn` code mutates its surrounding context.  Between *items*,
this was saved/restored, but between impl items it was not. This meant
that we wound up with `CallSiteScope` entries with two parents (or
more!).  As far as I can tell, this is harmless in actual type-checking,
since the regions you interact with are always from at most one of those
branches. But it can slow things down.

Before, the effect was limited, since it only applied to impl items
within an impl. After rust-lang#37660, impl items are visisted all together at
the end, and hence this could create a very messed up
hierarchy. Isolating impl item properly solves both issues.

I cannot come up with a way to unit-test this; for posterity, however,
you can observe the messed up hierarchies with a test as simple as the
following, which would create a callsite scope with two parents both
before and after

```
struct Foo {
}

impl Foo {
    fn bar(&self) -> usize {
        22
    }

    fn baz(&self) -> usize {
        22
    }
}

fn main() { }
```

Fixes rust-lang#37864.
  • Loading branch information
nikomatsakis committed Dec 1, 2016
1 parent 908dba0 commit fa22fc3
Showing 1 changed file with 8 additions and 8 deletions.
16 changes: 8 additions & 8 deletions src/librustc/middle/region.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1066,7 +1066,9 @@ fn resolve_local<'a, 'tcx>(visitor: &mut RegionResolutionVisitor<'tcx, 'a>,
}
}

fn resolve_item<'a, 'tcx>(visitor: &mut RegionResolutionVisitor<'tcx, 'a>, item: &'tcx hir::Item) {
fn resolve_item_like<'a, 'tcx, F>(visitor: &mut RegionResolutionVisitor<'tcx, 'a>, id: ast::NodeId, walk: F)
where F: FnOnce(&mut RegionResolutionVisitor<'tcx, 'a>)
{
// Items create a new outer block scope as far as we're concerned.
let prev_cx = visitor.cx;
let prev_ts = mem::replace(&mut visitor.terminating_scopes, NodeSet());
Expand All @@ -1075,8 +1077,8 @@ fn resolve_item<'a, 'tcx>(visitor: &mut RegionResolutionVisitor<'tcx, 'a>, item:
var_parent: ROOT_CODE_EXTENT,
parent: ROOT_CODE_EXTENT
};
intravisit::walk_item(visitor, item);
visitor.create_item_scope_if_needed(item.id);
walk(visitor);
visitor.create_item_scope_if_needed(id);
visitor.cx = prev_cx;
visitor.terminating_scopes = prev_ts;
}
Expand Down Expand Up @@ -1179,17 +1181,15 @@ impl<'ast, 'a> Visitor<'ast> for RegionResolutionVisitor<'ast, 'a> {
}

fn visit_item(&mut self, i: &'ast Item) {
resolve_item(self, i);
resolve_item_like(self, i.id, |this| intravisit::walk_item(this, i));
}

fn visit_impl_item(&mut self, ii: &'ast hir::ImplItem) {
intravisit::walk_impl_item(self, ii);
self.create_item_scope_if_needed(ii.id);
resolve_item_like(self, ii.id, |this| intravisit::walk_impl_item(this, ii));
}

fn visit_trait_item(&mut self, ti: &'ast hir::TraitItem) {
intravisit::walk_trait_item(self, ti);
self.create_item_scope_if_needed(ti.id);
resolve_item_like(self, ti.id, |this| intravisit::walk_trait_item(this, ti));
}

fn visit_fn(&mut self, fk: FnKind<'ast>, fd: &'ast FnDecl,
Expand Down

0 comments on commit fa22fc3

Please sign in to comment.