www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - -inline calling wrong virtual function!

reply Vathix <vathix dprogramming.com> writes:
class BaseFoo
{
    protected void stuff()
    {
       printf("BaseFoo.stuff()\n");
    }
}

class DerivedFoo: BaseFoo
{
    protected override void stuff()
    {
       printf("DerivedFoo.stuff()\n");
    }

    package final void baseStuff()
    {
       super.stuff();
    }
}

int main()
{
    DerivedFoo f;
    f = new DerivedFoo;
    f.stuff(); // Should print "DerivedFoo.stuff()".
    f.baseStuff(); // Should print "BaseFoo.stuff()".
    return 0;
}


Command "dmd test" shows this [correct] output:
DerivedFoo.stuff()
BaseFoo.stuff()

Command "dmd -inline test" shows this incorrect output:
DerivedFoo.stuff()
DerivedFoo.stuff()


A workaround is to insert some more code in baseStuff that won't get  
optimized away, such as
    void delegate() foo = &stuff;
so that it won't get inlined.
May 21 2005
parent Thomas Kuehne <thomas-dloop kuehne.this-is.spam.cn> writes:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Vathix schrieb am Sat, 21 May 2005 06:59:58 -0400:
 class BaseFoo
 {
     protected void stuff()
     {
        printf("BaseFoo.stuff()\n");
     }
 }

 class DerivedFoo: BaseFoo
 {
     protected override void stuff()
     {
        printf("DerivedFoo.stuff()\n");
     }

     package final void baseStuff()
     {
        super.stuff();
     }
 }

 int main()
 {
     DerivedFoo f;
     f = new DerivedFoo;
     f.stuff(); // Should print "DerivedFoo.stuff()".
     f.baseStuff(); // Should print "BaseFoo.stuff()".
     return 0;
 }


 Command "dmd test" shows this [correct] output:
 DerivedFoo.stuff()
 BaseFoo.stuff()

 Command "dmd -inline test" shows this incorrect output:
 DerivedFoo.stuff()
 DerivedFoo.stuff()


 A workaround is to insert some more code in baseStuff that won't get  
 optimized away, such as
     void delegate() foo = &stuff;
 so that it won't get inlined.

Added to DStress as http://dstress.kuehne.cn/run/i/inline_10_A.d http://dstress.kuehne.cn/run/i/inline_10_B.d http://dstress.kuehne.cn/run/i/inline_10_C.d Thomas -----BEGIN PGP SIGNATURE----- iD8DBQFCnb+F3w+/yD4P9tIRAjoyAKCNCZ2K3TC+ryMz+rmw+OIS5KmpygCdEuFP HJEmjWeXuueLIa4J3jLyrK8= =XzVe -----END PGP SIGNATURE-----
Jun 01 2005