https://issues.dlang.org/show_bug.cgi?id=15246
--- Comment #6 from Marco Leise <[email protected]> --- I'd agree with you if this was all not observable, but your change causes friction that I object against. It should be either inheritance all the way or just sequential calls as right now. Otherwise destructors will be perceived as inheriting while type-checking and as stand-alone when called directly. To illustrate this: import core.stdc.stdio; void main() { // Get a vanilla 'Ext' object without calling // constructors and spoiling the output. void[__traits(classInstanceSize, Ext)] buf = void; buf[] = typeid(Ext).init[]; // Show constructor/destructor semantics. Ext ext = cast(Ext) buf.ptr; ext.__ctor(); ext.__dtor(); } class Base { void* v; this() { printf("Base ctor\n"); } ~this() { printf("Base dtor\n"); } // never called } class Ext : Base { this() { printf("Ext ctor\n"); } ~this() @nogc nothrow { printf("Ext dtor\n"); } } Prints: Base ctor Ext ctor Ext dtor In particular in this example with D's semantics it is correct to have Ext's destructor be @nogc nothrow while the Base destructor is not. It may be surprising depending on programming language background, but at least it is consistently implemented as far as I can tell. --
