about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2014-09-17 08:31:18 +0000
committerbors <bors@rust-lang.org>2014-09-17 08:31:18 +0000
commit12b757b370a2f1138139b507da776d4aa32f2db9 (patch)
tree37f7f30e39983ccb1b1f69946fb0481437a0ce83
parent88cb454b91b16fdf8395bc4859b65aff8303acb5 (diff)
parentf1c4e476e9ecfcbcce167ce2c34840ccee71a1d4 (diff)
downloadrust-12b757b370a2f1138139b507da776d4aa32f2db9.tar.gz
rust-12b757b370a2f1138139b507da776d4aa32f2db9.zip
auto merge of #17246 : bkoropoff/rust/issue-17216, r=pnkfelix
Trans the cleanup scope of for loop bindings so we don't leak resources.  Regression test included.

Closes #17216
-rw-r--r--src/librustc/middle/trans/controlflow.rs5
-rw-r--r--src/test/run-pass/issue-17216.rs32
2 files changed, 36 insertions, 1 deletions
diff --git a/src/librustc/middle/trans/controlflow.rs b/src/librustc/middle/trans/controlflow.rs
index fb12520741b..5bba188fac7 100644
--- a/src/librustc/middle/trans/controlflow.rs
+++ b/src/librustc/middle/trans/controlflow.rs
@@ -355,7 +355,10 @@ pub fn trans_for<'blk, 'tcx>(mut bcx: Block<'blk, 'tcx>,
 
     // Codegen the body.
     body_bcx_out = trans_block(body_bcx_out, body, expr::Ignore);
-    body_bcx_out.fcx.pop_custom_cleanup_scope(binding_cleanup_scope);
+    body_bcx_out =
+        body_bcx_out.fcx
+                    .pop_and_trans_custom_cleanup_scope(body_bcx_out,
+                                                        binding_cleanup_scope);
     body_bcx_out =
         body_bcx_out.fcx
                     .pop_and_trans_custom_cleanup_scope(body_bcx_out,
diff --git a/src/test/run-pass/issue-17216.rs b/src/test/run-pass/issue-17216.rs
new file mode 100644
index 00000000000..538b837d117
--- /dev/null
+++ b/src/test/run-pass/issue-17216.rs
@@ -0,0 +1,32 @@
+// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![feature(unsafe_destructor)]
+
+struct Leak<'a> {
+    dropped: &'a mut bool
+}
+
+#[unsafe_destructor]
+impl<'a> Drop for Leak<'a> {
+    fn drop(&mut self) {
+        *self.dropped = true;
+    }
+}
+
+fn main() {
+    let mut dropped = false;
+    {
+        let leak = Leak { dropped: &mut dropped };
+        for ((), leaked) in Some(((),leak)).move_iter() {}
+    }
+
+    assert!(dropped);
+}