December 10, 2016
http://bugzilla.gdcproject.org/show_bug.cgi?id=248

            Bug ID: 248
           Summary: Regression: Call result not properly saved when
                    calling a vtbl function
           Product: GDC
           Version: development
          Hardware: All
                OS: All
            Status: NEW
          Severity: normal
          Priority: Normal
         Component: gdc
          Assignee: ibuclaw@gdcproject.org
          Reporter: johannespfau@gmail.com

Reduced from a DDMD build regression:

We've got a function getMemtype which has side effects and returns a class object Bar which has a virtual function isintegral. The function is called in this way: getMemtype().isintegral(). In this call the return value of getMemtype, the reference to a Bar object, is needed twice: Once to get the vtbl entry for isintegral and once to pass the object reference as the this pointer for isintegral. I guess the result of the getMemtype call is not saved properly. We can certainly see that the getMemType function executes twice.

@Iain I'll assign this to you as you are more familiar with this code.

---------------------------------------------------
import std.stdio;

class Bar
{
    bool isintegral()
    {
        return false;
    }
}

class Symbol
{
    Bar getMemtype()
    {
        writeln("foo");
        return new Bar();
    }
}

class Enum
{
    Symbol sym;
    bool isintegral()
    {
        return sym.getMemtype().isintegral();
    }
}

void main()
{
    Enum e = new Enum();
    e.sym = new Symbol();
    e.isintegral();
}
---------------------------------------------------

-- 
You are receiving this mail because:
You are watching all bug changes.