about summary refs log tree commit diff
diff options
context:
space:
mode:
authorSteve Klabnik <steve@steveklabnik.com>2016-05-11 09:27:43 -0400
committerSteve Klabnik <steve@steveklabnik.com>2016-05-11 09:27:43 -0400
commit3b75f4b56efb0f4da02031d5b964977e4dc1fbba (patch)
tree278f09955374c1ce8d768dc05be4cd88ab1009a8
parent82c4f5915bfb330db596d06b74eb406d21845f9e (diff)
parent6fed0132f314622700da9cd9f5746cfc4f4bb87f (diff)
downloadrust-3b75f4b56efb0f4da02031d5b964977e4dc1fbba.tar.gz
rust-3b75f4b56efb0f4da02031d5b964977e4dc1fbba.zip
Rollup merge of #33345 - birkenfeld:issue-31754, r=pnkfelix
middle: reset loop labels while visiting closure

This should fix #31754 and follow-up #25343.  Before the latter, the closure was visited twice in the context of the enclosing fn, which made even a single closure with a loop label emit a warning.

With this change, the closure is still visited within the context of the main fn (which is intended, since it is not a separate item) but resets the found loop labels while being visited.

Fixes: #31754

Note: I amended the test file from #25343, but I don't know if the original or amended test are effective, since as far as I could see, compiletest's run-pass tests do not check for zero warnings emitted?

/cc @Manishearth
-rw-r--r--src/librustc/middle/resolve_lifetime.rs7
-rw-r--r--src/test/run-pass/issue-25343.rs15
2 files changed, 21 insertions, 1 deletions
diff --git a/src/librustc/middle/resolve_lifetime.rs b/src/librustc/middle/resolve_lifetime.rs
index 23eb5a56c84..5c062316310 100644
--- a/src/librustc/middle/resolve_lifetime.rs
+++ b/src/librustc/middle/resolve_lifetime.rs
@@ -193,7 +193,12 @@ impl<'a, 'v> Visitor<'v> for LifetimeContext<'a> {
                 })
             }
             FnKind::Closure(_) => {
-                self.add_scope_and_walk_fn(fk, fd, b, s, fn_id)
+                // Closures have their own set of labels, save labels just
+                // like for foreign items above.
+                let saved = replace(&mut self.labels_in_fn, vec![]);
+                let result = self.add_scope_and_walk_fn(fk, fd, b, s, fn_id);
+                replace(&mut self.labels_in_fn, saved);
+                result
             }
         }
     }
diff --git a/src/test/run-pass/issue-25343.rs b/src/test/run-pass/issue-25343.rs
index 9e01d577276..64e7350fb82 100644
--- a/src/test/run-pass/issue-25343.rs
+++ b/src/test/run-pass/issue-25343.rs
@@ -8,9 +8,24 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+#[allow(unused)]
 fn main() {
     || {
         'label: loop {
         }
     };
+
+    // More cases added from issue 31754
+
+    'label2: loop {
+        break;
+    }
+
+    let closure = || {
+        'label2: loop {}
+    };
+
+    fn inner_fn() {
+        'label2: loop {}
+    }
 }