www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Using delegates in callbacks for extern(C) functions

reply simendsjo <simendsjo gmail.com> writes:
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()
Feb 24 2012
next sibling parent reply Timon Gehr <timon.gehr gmx.ch> writes:
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.
Feb 25 2012
parent =?UTF-8?B?QWxpIMOHZWhyZWxp?= <acehreli yahoo.com> writes:
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
Feb 27 2012
prev sibling next sibling parent simendsjo <simendsjo gmail.com> writes:
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
Feb 25 2012
prev sibling parent "Jonathan M Davis" <jmdavisProg gmx.com> writes:
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
Feb 27 2012