function pointers in D2

Christopher Nicholson-Sauls ibisbasenji at gmail.com
Sun Dec 12 02:28:10 PST 2010


On 12/12/10 03:54, Nrgyzer wrote:
> Hey guys,
> 
> I've used D1 in the past and D1 seems to check for correct function
> pointers. In D2 I can pass any function pointer to an function, for
> example:
> 
> ...
> void example(void function(int, int) fp) {
> ...
> }
> 
> ...
> void callback1(int x, int y) {
> }
> void callback2() {
> }
> ...
> 
> example(&callback1); // Works in D1 and D2
> example(&callback2); // Works in D2, but D1 says that example needs
> an pointer (int, int) signature which is logical. D1 says "... (void
> function(int, int)) does not match parameter types void function())"
> 
> But... why does D2 accept callback2? When I compile an application by
> using debug mode in D2, the callback works... in release mode it
> produces an "object.Error: Access Violation".
> 
> Is there any chance to check for correct function pointers in D2?

Confirmed behavior with DMD 2.050 on Linux.  Somewhat more telling example:
--------------------------------------------------
import std.stdio;

void example ( void function( int, int ) fp ) {
    writef( "fp( %s, %s ) == ", 5, 10 );
    fp( 5, 10 );
}

void callback1 ( int x, int y ) { writefln( "callback1( %s, %s )", x, y ); }

void callback2 ( int z ) { writefln( "callback2( %s )", z ); }

void callback3 () { writeln( "callback3()" ); }

void main () {
    example( &callback1 );
    example( &callback2 );
    example( &callback3 );
}
--------------------------------------------------

Compiles clean and outputs:
fp( 5, 10 ) == callback1( 5, 10 )
fp( 5, 10 ) == callback2( 10 )
fp( 5, 10 ) == callback3()

Which says to me that the arguments are going to the stack even when
unneeded.  It appears DMD is failing to check the pointer type?  This
surprises me, and certainly has to be a bug.

-- Chris N-S


More information about the Digitalmars-d-learn mailing list