Created attachment 497 [details] Reference counting doesn't work when temporaries created Function f returns (by value) a struct that has a destructor. If I explicitly assign the result of f to a temporary, that temporary is destroyed at the end of scope. If I don't assign it, the hidden temporary is not destroyed. In the attached example this screws up reference counting.
*** Issue 3518 has been marked as a duplicate of this issue. ***
I don't know if this is useful information, but I've been bitten by this same bug under Linux with DMD 2.036.
Reduced test case: extern(C) int printf(const char*, ...); int numctor, numdtor; struct Tid { this(int i) { ++numctor; } ~this() { ++numdtor; } } Tid f() { return Tid(1); } // This temporary is destroyed void test1() { Tid tid = f(); } // This (invisible) temporary is never destroyed void test2() { f(); } void main() { numctor = numdtor = 0; test1(); printf("numctor = %d, numdtor = %d\n", numctor, numdtor); assert(numctor == 1); assert(numdtor == 1); numctor = numdtor = 0; test2(); printf("numctor = %d, numdtor = %d\n", numctor, numdtor); assert(numctor == 1); assert(numdtor == 1); } Current results: numctor = 1, numdtor = 1 numctor = 1, numdtor = 0 core.exception.AssertError@bug3516(31): Assertion failure
*** Issue 3285 has been marked as a duplicate of this issue. ***
Still active in 2.047, testcase: import std.stdio; struct A { int a; this(int a) { this.a = a; writeln("hello, ", a); } ~this() { writeln("bye, ", a); } void doSth() { writeln("something"); } } void main() { auto a1 = A(1); a1.doSth(); A(2).doSth(); } produces: hello, 1 something hello, 2 something bye, 1
Upvoted.
Upvoted. By recent usage of struct, this bug is serious. This should be supported quickly. I suspect that these may be connected with each other: http://d.puremagic.com/issues/show_bug.cgi?id=4712
This bug also seems like it could be the cause of http://d.puremagic.com/issues/show_bug.cgi?id=4613
*** Issue 4613 has been marked as a duplicate of this issue. ***
This one is critical for QtD. Can it be fixed soon?
The test case in comment #3 now passes with DMD git HEAD, and this bug is now listed as fixed in the DMD changelog.
Closing this bug, as all of the test cases in this report now work, and destructors are also called when exceptions are present: https://github.com/D-Programming-Language/dmd/commit/41abb2b915d1c826af83a2c8cba5f6fb646d1089 If there are any remaining cases where destructors are not called, they should be reported as a different bug.