[Issue 18029] New: extra dtor call with typed variadic argument (or missing postblit)

d-bugmail at puremagic.com d-bugmail at puremagic.com
Mon Dec 4 06:57:48 UTC 2017


https://issues.dlang.org/show_bug.cgi?id=18029

          Issue ID: 18029
           Summary: extra dtor call with typed variadic argument (or
                    missing postblit)
           Product: D
           Version: D2
          Hardware: x86
                OS: All
            Status: NEW
          Severity: normal
          Priority: P1
         Component: dmd
          Assignee: nobody at puremagic.com
          Reporter: ketmar at ketmar.no-ip.org

the following code failing the assertion:

===
int rc = 0;

struct S {
  int n;
  this (int na) { ++rc; n = na; import core.stdc.stdio; printf("ctor for
(n=%d)\n", n); }
  this (this) { if (n) ++rc; import core.stdc.stdio; printf("postblit for
(n=%d)\n", n); }
  ~this () { if (n) --rc; import core.stdc.stdio; printf("dtor for (n=%d)\n",
n); n = 0; }
}

void test0 (S[] vals...) {
  vals[0] = S.init; //(1) this causes the bug
}

void test1 () {
  auto a0 = S(1);
  test0(a0);
}

void main () {
  test1();
  assert(rc == 0);
}
===

`dtor for (n=1)` is called twice, but only if (1) is not commented. comment out
(1), and the bug is gone.

*technically* calling dtor on already destructed struct is not a bug. but IRL
it will ruin any reference counting scheme.

tbh, i don't know how to fix this... let's say "corner case" without loosing
performance.

also, i dont' know why `a0` isn't cleared by `vals[0] = S.init;`. i thought
that typed vararg just creates a slice of program stack, and assigning `.init`
to `vals` member should clear `a0`. either that, or compiler should call
postblit for each typed vararg member (please, no! ;-).

so, this can be "missing postblit call" case too. i put both in subj until
we'll decide what should be done in this case.

please note that i'm clearing `n` in dtor, so calling dtor on already
"destroyed" struct should not be disasterous. but somehow `a0` is not cleared.

--


More information about the Digitalmars-d-bugs mailing list