Destructors and static array assignment
Kenji Hara via Digitalmars-d
digitalmars-d at puremagic.com
Mon Jul 20 07:52:11 PDT 2015
At least there's a dmd bug.
For such static array assignment, dmd should use druntime function, but
instead plain memory copy operation used.
https://github.com/D-Programming-Language/dmd/blob/master/src/e2ir.c#L2920
https://github.com/D-Programming-Language/dmd/blob/master/src/e2ir.c#L2945
And, even after the bug is fixed, I think it's debatable behavior whether
an element-wise assignment should call opAssign on each elements, because
it can be a kind of optimization.
Related issue: https://issues.dlang.org/show_bug.cgi?id=8931
Kenji Hara
2015-07-20 23:18 GMT+09:00 David Nadlinger via Digitalmars-d <
digitalmars-d at puremagic.com>:
> 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/digitalmars-d/attachments/20150720/04c871fa/attachment.html>
More information about the Digitalmars-d
mailing list