about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMichael Sullivan <sully@msully.net>2011-08-04 17:58:12 -0700
committerMichael Sullivan <sully@msully.net>2011-08-04 17:58:12 -0700
commit66a255ac9291306f3943acb2a00e159ccc15dfa4 (patch)
tree97cd78f37ad3710e9b402475c3356907d66bb68a
parent9a5e9806f3845731b9c4bdb1b986332ac9ed35b2 (diff)
downloadrust-66a255ac9291306f3943acb2a00e159ccc15dfa4.tar.gz
rust-66a255ac9291306f3943acb2a00e159ccc15dfa4.zip
Add a cleanup for copying closures. Closes #804.
-rw-r--r--src/comp/middle/trans.rs3
-rw-r--r--src/test/run-pass/lambda-no-leak.rs7
2 files changed, 10 insertions, 0 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 360821a0302..7e913c52839 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -6387,6 +6387,9 @@ fn trans_closure(bcx_maybe: &option::t[@block_ctxt],
 
         let closure = create_real_fn_pair(env.bcx, option::get(llfnty),
                                           llfndecl, env.ptr);
+        if copying {
+            add_clean_temp(bcx, closure, node_id_type(cx.ccx, id))
+        }
         some({fn_pair: closure, bcx: env.bcx})
       }
       _ { none }
diff --git a/src/test/run-pass/lambda-no-leak.rs b/src/test/run-pass/lambda-no-leak.rs
new file mode 100644
index 00000000000..183c1ae1446
--- /dev/null
+++ b/src/test/run-pass/lambda-no-leak.rs
@@ -0,0 +1,7 @@
+// Make sure we don't leak lambdas in silly ways.
+fn force(f: &fn()) { f() }
+fn main() {
+    let x = 7;
+    lambda() { log_err x; };
+    force(lambda() { log_err x; });
+}