From 66a255ac9291306f3943acb2a00e159ccc15dfa4 Mon Sep 17 00:00:00 2001 From: Michael Sullivan Date: Thu, 4 Aug 2011 17:58:12 -0700 Subject: [PATCH] Add a cleanup for copying closures. Closes #804. --- src/comp/middle/trans.rs | 3 +++ src/test/run-pass/lambda-no-leak.rs | 7 +++++++ 2 files changed, 10 insertions(+) create mode 100644 src/test/run-pass/lambda-no-leak.rs diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index 360821a0302e..7e913c528396 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 000000000000..183c1ae14462 --- /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; }); +}