Bug? NVI functions can't call normal interface functions?

Steven Schveighoffer schveiguy at yahoo.com
Tue Mar 19 14:51:52 PDT 2013


On Sun, 17 Mar 2013 09:59:03 -0400, Maxim Fomin <maxim at maxim-fomin.ru>  
wrote:

> Actually it was http://d.puremagic.com/issues/show_bug.cgi?id=4589

I don't think this is the same problem.

I modified the program a bit:

import core.stdc.stdio;
interface Timer
{
     final int run() { printf("Timer.run(), this=%x\n", cast(void*)this);  
fun(); return 1;}
     int fun();
}
interface Application
{
     final int run() { printf("Application.run(), this=%x\n", cast(void  
*)this); fun(); return 2; };
     int fun();
}

class TimedApp : Timer, Application
{
     int fun()
     {
         printf("TimedApp.fun(), this=%x\n", cast(void*)this);
         return 0;
     }
}

void main()
{
     auto app = new TimedApp;
     (cast(Application)app).run();
     (cast(Timer)app).run();
     app.Application.run();
     app.Timer.run();
}

New output:

Application.run(), this=10007ff8
TimedApp.fun(), this=10007fe0
Timer.run(), this=10007ff0
TimedApp.fun(), this=10007fe0
Application.run(), this=10007fe0
Timer.run(), this=10007fe0

Note that Application.run() is given the interface pointer 10007ff8,  
whereas the *true* object pointer is 10007fe0.  This is normal and  
expected.

However, in the *last* call to Application.run (and Timer.run), it's given  
the pointer 10007fe0, the true object pointer.  This gives it the  
completely WRONG vtable to use for calling fun.  I think this is different  
than the bug I posted.  It may be related, I don't know.

If this bug is not already reported, it should be.

-Steve


More information about the Digitalmars-d mailing list