I think this "final" part can be unconditionally simplified: All your data is basically either already constructed, or in a T.init state. This means you can *move* things around, regardless of destructors and/or elaborate assign. In particular, it avoid the assign in `array[pos..pos+to_insert] = tmp[];`. EG:

```D
array.length += to_insert; //Prepare some extra room.
trustedMemmove([pos .. oldLen], array[pos+to_insert..$]); //Move the elements
trustedMemcopy(array[pos..pos+to_insert], tmp[]); //Move more elements
```

`tmp` never leaves this scope, so there is no need to postblit its elements, or destroy them.