Bug 3516 – Destructor not called on temporaries

Status
RESOLVED
Resolution
FIXED
Severity
critical
Priority
P3
Component
dmd
Product
D
Version
D2
Platform
Other
OS
Windows
Creation time
2009-11-16T14:32:00Z
Last change time
2015-06-09T01:26:47Z
Keywords
wrong-code
Assigned to
nobody
Creator
bartosz
Blocks
4490

Attachments

IDFilenameSummaryContent-TypeSize
497bug.dReference counting doesn't work when temporaries createdapplication/octet-stream1792

Comments

Comment #0 by bartosz — 2009-11-16T14:32:39Z
Created attachment 497 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.
Comment #1 by bartosz — 2009-11-16T16:31:43Z
*** Issue 3518 has been marked as a duplicate of this issue. ***
Comment #2 by lmb — 2009-11-29T03:21:36Z
I don't know if this is useful information, but I've been bitten by this same bug under Linux with DMD 2.036.
Comment #3 by braddr — 2010-05-30T15:59:09Z
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
Comment #4 by lio+bugzilla — 2010-07-06T01:34:59Z
*** Issue 3285 has been marked as a duplicate of this issue. ***
Comment #5 by adrian — 2010-07-10T06:11:10Z
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
Comment #6 by andrei — 2010-07-10T06:25:14Z
Upvoted.
Comment #7 by zan77137 — 2010-08-23T09:52:25Z
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
Comment #8 by andy — 2010-09-20T08:51:34Z
This bug also seems like it could be the cause of http://d.puremagic.com/issues/show_bug.cgi?id=4613
Comment #9 by clugdbug — 2010-09-22T04:05:41Z
*** Issue 4613 has been marked as a duplicate of this issue. ***
Comment #10 by samukha — 2010-11-14T03:09:58Z
This one is critical for QtD. Can it be fixed soon?
Comment #11 by dlang-bugzilla — 2011-04-26T05:19:34Z
The test case in comment #3 now passes with DMD git HEAD, and this bug is now listed as fixed in the DMD changelog.
Comment #12 by clugdbug — 2011-06-27T03:06:44Z
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.