We are seeing a problem with passing ref parameters to properties. This bug only occurs in certain situations. Consider the following code:

====
void runTest()
{
        Thing t;
t.vPosition = (Clock.currStdTime % 2 == 0) ? Vec(2, 2) : Vec(3, 3);
        Vec v = t.vPosition;

        outputDebug("%d %d\n", v.x, v.y);
}

struct Vec
{
        int x;
        int y;
}

struct Thing
{
        @property Vec vPosition() { return mPosition; }
@property Vec vPosition( const ref Vec value ) { return mPosition = value; }

private:
        Vec mPosition;
}
===

Now, this code should output either "2 2" or "3 3" depending on the time. However, on release builds this code will output "0 0" every time it is run. This seems to happen regardless of the optimization level (we have tried with -O1 and -O3). Some things to note is that the bug will NOT occur if any of the following is true:

- We compile the code in debug mode. - We specify a constant known at compile time (eg. "true") instead of the non-deterministic time value. - We save the vector into a temporary local variable before passing it to the property. - We remove the "const ref" from the property setter and pass the vector by value.

Debugging the code reveals that the value passed to the getter is indeed 0,0, which rules out the getter as the error source.

We are building this on x64 Windows using gdc version 4.6.1 20110627 (gdc hg r826:396ce79e6402(default), using dmd ) (tdm64-1).

Any idea what's going on?

Reply via email to