On Tuesday, 14 December 2021 at 15:28:30 UTC, Steven Schveighoffer wrote:

All the other problems you are having are deriving from this problem.

Not exactly. One of the problems seems to be a genuine bug:

```d
struct S
{
    int[] x;

    // doesn't even participate here, neither would postblit
    this(ref return scope inout S other)
    {
        x = other.x.dup;
    }

    void opAssign(ref return scope inout S other)
    {
        x = other.x.dup;
    }
}

void main()
{
    immutable(S)[] src = [S([1, 2]), S([3, 4])];

    auto dst = new S[src.length];

//dst[0 .. $] = src[0 .. $]; // this fails to compile even with opAssign defined

    // this works:
    foreach (i, ref it; dst)
        it = src[i];
}
```

Spec: https://dlang.org/spec/arrays.html#array-copying

...contents of the array are the target of the assignment...

Per that wording, slice assignment should perform the equivalent of that foreach loop (after overlap checks, etc.). It doesn't, just tries implicit conversion, and fails.

Now, since we have copy ctors, slice assignment should, ostensibly, attempt to copy-assign elements (i.e. absent opAssign, try the copy ctor first).

Reply via email to