In the release binaries of dmd, you can see that there is a run-time regression as well.
---
void main()
{
struct hasDtor
{
import core.stdc.stdio;
int count;
~this() { printf("dtor(%d)\n", count); }
}
hasDtor[4] arr4 = hasDtor(4);
}
---
dtor(1)
dtor(37)
dtor(0)
dtor(0)
dtor(4)
dtor(4)
dtor(4)
dtor(4)
---
Because the codegen is calling _d_arraysetassign, the destructor is being ran on the uninitialized array.