<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">Sorry for the delay. I was traveling abroad this weekend.</div><div class=""><br class=""></div><div class=""><blockquote type="cite" class="">On Oct 3, 2014, at 14:13, Eric Fiselier <<a href="mailto:eric@efcs.ca" class="">eric@efcs.ca</a>> wrote:</blockquote></div><div class=""><blockquote type="cite" class=""><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><div class=""><div style="font-family:arial,sans-serif;font-size:13px" class="">I'm quite unfamiliar with Apple Blocks and their lifetime semantics. Would you be able to point to some documentation? </div></div></div></div></blockquote><div class=""><br class=""></div><div class=""><div class="">The official ref is a bit dense to read but here it is:</div><div class=""> * <a href="http://clang.llvm.org/docs/Block-ABI-Apple.html" class="">http://clang.llvm.org/docs/Block-ABI-Apple.html</a></div><div class=""><br class=""></div><div class="">The short of it is that blocks, like lambdas, are structs. The block-pointer ("R (^)(Args)") is a pointer to that struct. The block-pointer is callable, but there is no syntax to "dereference" the block-pointer, so you cant directly copy/move a block. </div><div class=""><br class=""></div><div class="">To extend the life of a block (eg, put it in a std::function), you must call Block_copy, save the (probably different) pointer that is returned, and eventually balance out with a call to Block_release on that returned pointer.</div><div class=""><br class=""></div><div class="">The hand-wavey description of what is happening is this:</div><div class=""> * If you call Block_copy on a stack-based block, it returns a (different) pointer to a heap-based block (with ref-count 1).</div><div class=""> * If you call Block_copy on a heap-based block, it returns the same pointer (and you have a new ref to it).</div><div class=""><br class=""></div><div class="">The ABI has the detailed nuances (eg, static-scoped blocks, blocks with trivial capture, blocks in ObjC), but the simple "Block_copy + keep + Block_release" sequence is how you extend a block's life in C and C++.</div></div><br class=""><blockquote type="cite" class=""><div dir="ltr" class=""><div class=""><div style="font-family:arial,sans-serif;font-size:13px" class="">> The current problem is that if you write something like this:</div><div style="font-family:arial,sans-serif;font-size:13px" class="">   template <typename F> doSomething(F&& functor) { std::function<...> capturing = std::forward<F>(functor); ... }</div><div style="font-family:arial,sans-serif;font-size:13px" class="">This works great for lambdas. For blocks, it compiles just fine but has runtime issues.</div></div><div style="font-family:arial,sans-serif;font-size:13px" class=""><br class=""></div><div style="font-family:arial,sans-serif;font-size:13px" class="">I think in understand this, but would you be able to flush out your example?</div></div></blockquote><div class=""><br class=""></div><div class="">Yes, let me do that in my next email since David also asked this.</div><br class=""><blockquote type="cite" class=""><div dir="ltr" class=""><div style="font-family:arial,sans-serif;font-size:13px" class=""><br class=""></div>> <span style="font-family:arial,sans-serif;font-size:13px" class="">But, after looking over this patch if it doesnt feel right, I would at least suggest we add =delete/enable_if's to the right places so at least incorrect code wont compile</span><div class=""><span style="font-family:arial,sans-serif;font-size:13px" class=""><br class=""></span></div><div class=""><span style="font-family:arial,sans-serif;font-size:13px" class="">This patch feels right. I would be happy to review it once it is a complete. Also, is it possible to test Apple Blocks on Linux?</span></div></div></blockquote><div class=""><br class=""></div><div class="">I dont know this personally, but as long as it has Block.h (part of compiler-rt) and clang is compiled with block support, it should work. But, I havent tried it personally.</div><br class=""></div><div class="">Jared</div><br class=""></body></html>