https://issues.dlang.org/show_bug.cgi?id=13531
Stanislav Blinov <stanislav.bli...@gmail.com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |stanislav.bli...@gmail.com --- Comment #2 from Stanislav Blinov <stanislav.bli...@gmail.com> --- Nowadays the error message is... better, for a conservative definition of "better". But it's __very__ verbose and most of all, wrong. It's referring to SS.~this, which is not at all the destructor in question - SS.__xdtor is. It's even referring to the line where SS.~this is declared! SS.~this has the attributes, and the error message shouldn't indicate that it doesn't. main.d(16): Error: `pure` function `D main` cannot call impure destructor `SS.~this` main.d(10): generated `SS.~this` is impure because of the following field's destructors: main.d(9): - S s main.d(3): impure `S.~this` is declared here main.d(16): Error: `@safe` function `D main` cannot call `@system` destructor `SS.~this` main.d(10): `SS.~this` is declared here main.d(10): generated `SS.~this` is @system because of the following field's destructors: main.d(9): - S s main.d(3): @system `S.~this` is declared here main.d(16): Error: `@nogc` function `D main` cannot call non-@nogc destructor `SS.~this` main.d(10): generated `SS.~this` is non-@nogc because of the following field's destructors: main.d(9): - S s main.d(3): non-@nogc `S.~this` is declared here main.d(16): Error: destructor `SS.~this` is not `nothrow` main.d(10): generated `SS.~this` is not nothrow because of the following field's destructors: main.d(9): - S s main.d(3): not nothrow `S.~this` is declared here main.d(14): Error: `nothrow` function `D main` may throw Add more fields to SS, and this gets even longer. With this code: struct S { ~this() //not nothrow, system, impure, gc etc... {} } struct S2 { ~this() {} } struct SS { S s; ~this() @safe pure nothrow @nogc {} } struct SSS { SS ss; ~this() @safe pure nothrow @nogc {} } void main() @safe pure nothrow @nogc { SSS ss; } ...errors are page long :\ Suggested change: main.d(16): Error: `@safe pure nothrow @nogc` function `D main` cannot call impure @system throwing GC-using generated destructor for `SS` main.d(9): Generated destructor for `SS` is impure @system throwing GC-using because of destructor of field `s` main.d(3): impure @system throwing GC-using destructor of field `s` is declared here ...with one relevant line per field, correctly distinguishing generated destructors and user-defined destructors. --