<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Nov 11, 2014 at 6:37 PM, Rafael Espíndola <span dir="ltr"><<a href="mailto:rafael.espindola@gmail.com" target="_blank">rafael.espindola@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Oh, I see.<br>
<br>
Would making just the member a std::function be correct? Would it be<br>
profitable or are we better with just a std::function everywhere?<br></blockquote><div><br>I think the right answer is to use std::function everywhere here (pass by value, use std::move, etc).<br><br>The case in Clang where we came across this was a bit narrow:<br><br>struct foo {<br>  function_ref f;<br>  foo(function_ref f) : f(f) {}<br>  void func() { /* stuff with 'f' */ }<br>};<br><br>void helper() {<br>  foo([&] { return ...; }).func();<br>}<br><br>which, once I fixed that bug, is safe - but only because the foo object was created, used, and destroyed within a single full expression and the underlying functor had a lifetime at least as long as the lifetime of the 'foo' object created there (both had a lifetime to the end of the full expression).<br><br>Once you do this:<br><br>foo f([&] { return ...; });<br>f.func();<br><br>you would need foo to accept a std::function ctor parameter and have a std::function member. (if you have a function_ref parameter, the std::function would copy the function_ref, but that wouldn't copy the underlying lambda object, so it'd have dangling pointers to the temporary lambda object).<br><br>Hope that helps/explains things - let me know if it's at all unclear,<br><br>- David<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="HOEnZb"><div class="h5"><br>
On 11 November 2014 21:28, David Blaikie <<a href="mailto:dblaikie@gmail.com">dblaikie@gmail.com</a>> wrote:<br>
><br>
><br>
> On Tue, Nov 11, 2014 at 6:23 PM, Rafael Espindola<br>
> <<a href="mailto:rafael.espindola@gmail.com">rafael.espindola@gmail.com</a>> wrote:<br>
>><br>
>> Author: rafael<br>
>> Date: Tue Nov 11 20:23:37 2014<br>
>> New Revision: 221756<br>
>><br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=221756&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=221756&view=rev</a><br>
>> Log:<br>
>> Use a function_ref now that it works (r221753).<br>
>><br>
>><br>
>> Modified:<br>
>>     llvm/trunk/include/llvm/Linker/Linker.h<br>
>><br>
>> Modified: llvm/trunk/include/llvm/Linker/Linker.h<br>
>> URL:<br>
>> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Linker/Linker.h?rev=221756&r1=221755&r2=221756&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Linker/Linker.h?rev=221756&r1=221755&r2=221756&view=diff</a><br>
>><br>
>> ==============================================================================<br>
>> --- llvm/trunk/include/llvm/Linker/Linker.h (original)<br>
>> +++ llvm/trunk/include/llvm/Linker/Linker.h Tue Nov 11 20:23:37 2014<br>
>> @@ -11,8 +11,8 @@<br>
>>  #define LLVM_LINKER_LINKER_H<br>
>><br>
>>  #include "llvm/ADT/SmallPtrSet.h"<br>
>> +#include "llvm/ADT/STLExtras.h"<br>
>><br>
>> -#include <functional><br>
>><br>
>>  namespace llvm {<br>
>>  class DiagnosticInfo;<br>
>> @@ -25,7 +25,7 @@ class StructType;<br>
>>  /// something with it after the linking.<br>
>>  class Linker {<br>
>>    public:<br>
>> -    typedef std::function<void(const DiagnosticInfo &)><br>
>> +    typedef function_ref<void(const DiagnosticInfo &)><br>
>>          DiagnosticHandlerFunction;<br>
><br>
><br>
> I think this usage is wrong, unfortunately.<br>
><br>
> I haven't managed to look at all the Linker code, but at least looking at<br>
> "Linker::Linker(Module *M)" this seems as if it'll have problems.<br>
><br>
> That ctor initializes the member function_ref with a lambda. That' means the<br>
> function_ref will point to the lambda (unlike std::function which would copy<br>
> the lambda into itself) - but once the variable's initializer in the ctor<br>
> finishes, the lambda will be destroyed, leaving the function_ref dangling, I<br>
> think?<br>
><br>
> Any other caller that does something like:<br>
><br>
> Linken L([] { ... });<br>
> L.functionThatUsesTheMemberFunctionRef();<br>
><br>
> Will be equally problematic - as the lambda will be destroyed at the end of<br>
> the Linker variable's initialization, and the member function_ref will be<br>
> left dangling.<br>
><br>
>><br>
>><br>
>>      Linker(Module *M, DiagnosticHandlerFunction DiagnosticHandler);<br>
>><br>
>><br>
>> _______________________________________________<br>
>> llvm-commits mailing list<br>
>> <a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
>> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
><br>
><br>
</div></div></blockquote></div><br></div></div>