struct Bug6933 { int x = 3; ~this() { } } int test6933() { Bug6933 q; return 3; } static assert(test6933()); It's because interpret.c, getVarExp calls StructLiteralExp::semantic with NULL scope. semantic sees there's a destructor, and converts it into: (Bug7973 __tmp = Bug6973(), __tmp). This crashes because __tmp is a variable with no scope. I don't understand why it does that transformation, it seems to me to be in the wrong place.
In these commits: https://github.com/D-Programming-Language/dmd/commit/746d98fb0daacbd6a9efab1da6aacd2d7b55b39f https://github.com/D-Programming-Language/dmd/commit/0051ed8ea86472083ed205a4857399d1f8defd71 it's mitigated from a segfault to an rejects-valid with line number.
https://github.com/D-Programming-Language/dmd/commit/51bc588d2e834650e5278247cd06b5da36569feb https://github.com/D-Programming-Language/dmd/pull/602