View mode: basic / threaded / horizontal-split · Log in · Help
February 24, 2012
Using delegates in callbacks for extern(C) functions
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()
February 25, 2012
Re: Using delegates in callbacks for extern(C) functions
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. Workaround: The code compiles if you use function() {} instead. I 
don't know if a bug report exists already.
February 25, 2012
Re: Using delegates in callbacks for extern(C) functions
On Sat, 25 Feb 2012 17:12:50 +0100, Timon Gehr <timon.gehr@gmx.ch> 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. Workaround: The code compiles if you use function() {} instead. I  
> don't know if a bug report exists already.

Thanks. http://d.puremagic.com/issues/show_bug.cgi?id=7585
February 28, 2012
Re: Using delegates in callbacks for extern(C) functions
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.

Ali
February 28, 2012
Re: Using delegates in callbacks for extern(C) functions
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
Top | Discussion index | About this forum | D home