about summary refs log tree commit diff
diff options
context:
space:
mode:
authorFelix S. Klock II <pnkfelix@pnkfx.org>2013-09-05 02:22:06 +0200
committerFelix S. Klock II <pnkfelix@pnkfx.org>2013-09-05 02:32:36 +0200
commit41e7924670aefe4c39dd4a060452eb623854fde9 (patch)
tree4679597d00d23148c408e21366ba8975695e3b99
parent45c3ca72bc19230f82775eb4228f1b3f178baade (diff)
downloadrust-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.rs9
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.