diff options
| author | Felix S. Klock II <pnkfelix@pnkfx.org> | 2013-09-05 02:22:06 +0200 |
|---|---|---|
| committer | Felix S. Klock II <pnkfelix@pnkfx.org> | 2013-09-05 02:32:36 +0200 |
| commit | 41e7924670aefe4c39dd4a060452eb623854fde9 (patch) | |
| tree | 4679597d00d23148c408e21366ba8975695e3b99 | |
| parent | 45c3ca72bc19230f82775eb4228f1b3f178baade (diff) | |
| download | rust-41e7924670aefe4c39dd4a060452eb623854fde9.tar.gz rust-41e7924670aefe4c39dd4a060452eb623854fde9.zip | |
Fix #7740: gather_loans should not recur into the items of the block.
gather_loans does not need to recurse into any items declared in the
current block. Rather than special-case `fk_item_fn` and `fk_method`,
just make the GatherLoanVisitor's visit_item method a no-op.
This indirectly implies that the example of #7740 is fixed:
fn f() {
static A: &'static char = &'A';
}
Since we do not recurse into items, we no longer encounter `&'A'`.
| -rw-r--r-- | src/librustc/middle/borrowck/gather_loans/mod.rs | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/src/librustc/middle/borrowck/gather_loans/mod.rs b/src/librustc/middle/borrowck/gather_loans/mod.rs index be033de4e41..352a229633b 100644 --- a/src/librustc/middle/borrowck/gather_loans/mod.rs +++ b/src/librustc/middle/borrowck/gather_loans/mod.rs @@ -95,6 +95,11 @@ impl visit::Visitor<@mut GatherLoanCtxt> for GatherLoanVisitor { fn visit_local(&mut self, l:@Local, e:@mut GatherLoanCtxt) { gather_loans_in_local(self, l, e); } + + // #7740: Do not visit items here, not even fn items nor methods + // of impl items; the outer loop in borrowck/mod will visit them + // for us in turn. Thus override visit_item's walk with a no-op. + fn visit_item(&mut self, _:@ast::item, _:@mut GatherLoanCtxt) { } } pub fn gather_loans(bccx: @BorrowckCtxt, @@ -135,10 +140,8 @@ fn gather_loans_in_fn(v: &mut GatherLoanVisitor, id: ast::NodeId, this: @mut GatherLoanCtxt) { match fk { - // Do not visit items here, the outer loop in borrowck/mod - // will visit them for us in turn. &visit::fk_item_fn(*) | &visit::fk_method(*) => { - return; + fail!("cannot occur, due to visit_item override"); } // Visit closures as part of the containing item. |
