On Monday, February 27, 2012 16:42:06 Ali Çehreli wrote: > On 02/25/2012 08:12 AM, Timon Gehr wrote: > > On 02/24/2012 07:22 PM, simendsjo wrote: > >> I have a C function taking a callback function as a parameter. My > >> thought was to wrap this up using a template, but I cannot get it to > >> work: > >> > >> extern(C) alias void function() Callback; > >> > >> template Wrap(alias dg) > >> { > >> extern(C) void Wrap() > >> { > >> dg(); > >> } > >> } > >> > >> void main() > >> { > >> Callback cb = &Wrap!( () {} ); > >> } > >> > >> Error: cannot implicitly convert expression (&Wrap) of type void > >> delegate() pure nothrow @safe to extern (C) void function() > > > > This is a bug. '() {}' should be inferred as void function()pure nothrow > > @safe. > > Not according to the spec: "If the keywords function or delegate are > omitted, it defaults to being a delegate" > > http://dlang.org/expression.html#FunctionLiteral > > > Workaround: The code compiles if you use function() {} instead. > > If I read the spec correctly, one must use the 'function' keyword.
TDPL says that it's inferred, and I believe that work was recently done in improving the compiler's ability to infer it. So, in this case, the spec is almost certainly wrong. - Jonathan M Davis