<div dir="ltr">So, this was a bug. We forgot to make lambda call operators thiscall. They're C++ method decls, and should clearly use that convention. I changed in r233023 to reflect that.<div><br></div><div>Thanks for the report!</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Mar 23, 2015 at 2:44 AM, Sebastian Redl <span dir="ltr"><<a href="mailto:sebastian.redl@getdesigned.at" target="_blank">sebastian.redl@getdesigned.at</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 3/22/2015 6:25 PM, Daniel Berenyi wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Dear All,<span class=""><br>
<br>
//----------------------------<u></u>-------------------<br>
template<typename F><br>
  decltype(auto) deduce(F f){ return &decltype(f)::operator(); }<br>
<br>
template<typename C, typename R, typename A> decltype(auto)<br>
  signaturehelper( R(C::*f)(A)const ) { return R(); }<br>
<br>
int main()<br>
{<br>
  auto l = [](int x){return x*2;};<br>
  decltype(signaturehelper(<u></u>deduce(l))) p;<br>
}<br>
//----------------------------<u></u>----<br>
<br>
It fails with:<br>
decltype(signaturehelper(<u></u>deduce(l))) p;<br>
               ^~~~~~~~~~~~~~~<br>
note: candidate template ignored: substitution failure [with C = (lambda at main.cpp:9:11), R = float, A = int]<br>
decltype(auto) signaturehelper(R(C::*f)(A)<u></u>const) { return R(); }<br>
<br>
</span></blockquote>
I've had exactly the same problem when I tried to find the argument type of a lambda. Here's how I worked around it:<br>
<br>
        template <typename R, typename C, typename Arg, typename... Args><br>
        struct FirstArgumentImpl<R (C::*)(Arg, Args...) const><br>
        {<br>
            using type = Arg;<br>
        };<br>
        // for Clang on Windows<br>
        template <typename R, typename C, typename Arg, typename... Args><br>
        struct FirstArgumentImpl<R (__cdecl C::*)(Arg, Args...) const><br>
        {<br>
            using type = Arg;<br>
        };<br>
<br>
The issue appears to be that Clang gives the lambda's operator() a __cdecl calling convention instead of the default member __thiscall calling convention.<span class="HOEnZb"><font color="#888888"><br>
<br>
Sebastian</font></span><div class="HOEnZb"><div class="h5"><br>
______________________________<u></u>_________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu" target="_blank">cfe-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/cfe-dev</a><br>
</div></div></blockquote></div><br></div>