delegates/lambas do not pick up calling convention

Johnson Jones via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Aug 9 16:52:00 PDT 2017


given somethign like Threads.threadsAddIdle

which takes an extern(C) int (void*)

we can't seem to do

threadsAddIdle((void*) { }, null);

nor



because D complains is not the correct type nor can we do


delegate(void*)

or

extern(C) delegate(void*) {}


and have to resort to verbosity to get it to work. Is there a way 
around that? Why can't D realize that an inline lambda should use 
the same calling convention? There is no harm in doing so.

Maybe I'm doing it wrong:

I've tried

											import gdk.Threads;
												alias DD = static extern(C) int delegate(void*);
												auto x = (void*)
												{
													return 1;
												};
												gdk.Threads.threadsAddIdle(x, null);


which gives the error

(extern (C) int function(void* userData) funct, void* data) is 
not callable using argument types
             int function(void* _param_0) pure nothrow @nogc 
@safe, typeof(null))


While one can do something like

										gdk.Threads.threadsAddIdle(cast(GSourceFunc)(void* data)
													   {
																							   return 1;
													   }, null);

which seems to work but the cast seems superfluous as D should be 
able to implicitly figure that out since it's an inline delegate.





More information about the Digitalmars-d-learn mailing list