What is __dtor() supposed to do?
Steven Schveighoffer
schveiguy at yahoo.com
Tue Jul 19 07:04:08 PDT 2011
On Tue, 19 Jul 2011 09:42:32 -0400, Cristi Cobzarenco
<cristi.cobzarenco at gmail.com> wrote:
> This is somewhat in reference to a bug that I was having trouble with
> (Issue 5667 - http://d.puremagic.com/issues/show_bug.cgi?id=5667).
> Right now __dtor() simply represents the function defined between the
> curly braces of ~this(), not the compiler generated function that
> calls ~this() and the destructors of members in proper order. To
> illustrate:
>
> import std.stdio;
>
> struct A { ~this() { writeln( "A.~this()"); } }
> struct B {
> ~this() { writeln("B.~this()"); }
>
> A member;
> }
>
> struct C {
> A member;
> }
>
> void main() {
> A a;
> B b;
> C c;
>
> writeln( "using __dtor" );
> a.__dtor(); // prints "A.~this()" as expected
> b.__dtor(); // prints "B.~this()", but not "A.~this()
> // c.__dtor(); // does not compile because there is no ~this()
> defined in C
>
> writeln( "using TypeInfo_Struct.destroy" )
> typeid(B).destroy(&a); // prints both A.~this() and B.~this()
> typeid(C).destroy(&c); // compiles & prints A.~this();
>
> writeln( "going out of scope" );
> }
>
> Basically my question is - is this the required behaviour? Or should
> __dtor and destroy() do the same thing? If they should, then the bug I
> mentioned is a compiler bug. Otherwise, the fix I proposed to druntime
> would work.
destroy calls the xdtor member made by the compiler. The code for this
function as far as I can tell is generated by the compiler, so I would say
this is *definitely* a compiler bug. IMO, __dtor should map to the same
thing.
There is no reason I can think of to separate out the __dtor and the calls
to the destructors for any sub members. Can you?
-Steve
More information about the Digitalmars-d
mailing list