I started writting a fix. It is not that complicated actually.

> OK, so the problem is `hasElaborateAssign` not postblit.

`hasElaborateAssign` has since been fixed, and the problem *is* postblit. When you write `myArray = elem`, dmd will not care about `opAssign`, and will instead `postblit` elem over `myArray`. Technically, `hasElaborateAssign` is irrelevent, and we should just be looking at `hasElaborateCopyConstructor`.

I'm not entirelly sure if it is a bug that it behaves the way it does, but I documented it here: http://d.puremagic.com/issues/show_bug.cgi?id=8931

> Also the part about destroying unitialized data seems incorrect to me.

Actually, that's the entire issue:

```D
import std.stdio;

struct S
{
  string s = "uninitialized";
  void opAssign(S){}
  this(this){}
  ~this()
  {writefln("destroying: %s", s);}
}

void main()
{
  S[2] a; //assume = void
  S[2] b; //assume = void
  auto i = S("initialized");
  writeln("Test 1:");
  a = i;
  writeln("Test 2:");
  b = a;
  writeln("Finished");
}
```
```
Test 1:
destroying: uninitialized
destroying: uninitialized
Test 2:
destroying: uninitialized
destroying: uninitialized
Finished
destroying: initialized
destroying: initialized
destroying: initialized
destroying: initialized
destroying: initialized
```