Hi all,

I was about to fix an issue with postblits/destructors in LDC when I stumbled upon the following vexing behaviour in DMD (both 2.067.1 and master):

---
uint dtorCount;

struct S {
    uint x;
void opAssign(const ref S rhs) { assert(false, "Not called"); }
    ~this() { ++dtorCount; }
}


void main() {
    S[2] a;
    a[0].x = 42;

    a = a.init;

    assert(a[0].x == 0); // as expected the value has been reset
    assert(dtorCount == 0); // Passes?!?
}
---

I would have expected this to either call opAssign or to destruct the instance, blit the init value, and call any postblits. However, as you can see neither the dtor nor opAssign are executed. If I add a postblit to S, then suddenly the dtor is invoked too.

Am I missing something here, or is this a major bug in struct lifetime handling?

I understand why this happens from the DMD source, but it almost seems like it was deliberately written this way; thus the question.

 — David

Reply via email to