[Issue 14903] New: Destructors for arguments completely broken
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Mon Aug 10 16:54:55 PDT 2015
https://issues.dlang.org/show_bug.cgi?id=14903
Issue ID: 14903
Summary: Destructors for arguments completely broken
Product: D
Version: D2
Hardware: x86
OS: Mac OS X
Status: NEW
Severity: major
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: code at klickverbot.at
While finalizing the LDC 2.067 merge, Martin and I stumbled over major DMD
codegen issues for structs with destructors as function arguments. [1]
Consider this program:
---
import core.stdc.stdio;
struct Foo {
const char* name;
bool throwInDtor;
this(const char* name, bool throwInDtor) {
printf("Constructing %s\n", name);
this.name = name;
this.throwInDtor = throwInDtor;
}
~this() {
printf("Destroying %s\n", name);
if (throwInDtor)
throw new Exception("dtor " ~ name[0]);
}
}
Foo make(const char* name, bool doThrow) {
if (doThrow)
throw new Exception("make()");
return Foo(name, false);
}
void foo(Foo a, Foo b, Foo c, Foo d) { throw new Exception("foo()!"); }
void main() {
foo(Foo("a", true), make("b", true), Foo("c", false), make("d", true));
}
---
Depending on the arguments to the Foo constructor and make, we can get
different test cases for exception chaining and destruction of temporaries (DMD
2.068.0, OS X x86_64):
---
1) foo(Foo("a", true), make("b", false), Foo("c", true), make("d", false))
Constructing a
Constructing b
Constructing c
Constructing d
Destroying a
Destroying b
Destroying c
Destroying d
object.Exception at test.d(27): foo()!
object.Exception at test.d(17): dtor a
object.Exception at test.d(17): dtor c
2) foo(Foo("a", true), make("b", false), Foo("c", true), make("d", true))
Constructing a
Constructing b
Constructing c
object.Exception at test.d(23): make()
3) foo(Foo("a", false), make("b", false), Foo("c", false), make("d", true))
Constructing a
Constructing b
Constructing c
object.Exception at test.d(23): make()
4) foo(Foo("a", false), make("b", true), Foo("c", false), make("d", true))
Constructing a
object.Exception at test.d(23): make()
5) foo(Foo("a", true), make("b", true), Foo("c", false), make("d", true))
Constructing a
object.Exception at test.d(23): make()
---
1) is correct, although the order of destruction is somewhat unexpected (given
that they are destroyed by the callee, this is probably not wrong, though).
However, the destructors in 2) to 5) are never called.
[1] Our issue is at
https://github.com/ldc-developers/ldc/issues/1010#issuecomment-129596359
--
More information about the Digitalmars-d-bugs
mailing list