June 22, 2018
https://issues.dlang.org/show_bug.cgi?id=19015

          Issue ID: 19015
           Summary: arr[i..i] = c doesn't lower to a.opIndexAssign(c,
                    a.opSlice(i, j))
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: normal
          Priority: P1
         Component: dmd
          Assignee: nobody@puremagic.com
          Reporter: greensunny12@gmail.com

According to the docs (https://dlang.org/spec/operatoroverloading.html#slice_assignment_operator), this should work as:

>  Expressions of the form a[i..j] = c are rewritten as a.opIndexAssign(c, a.opSlice(i, j)), and a[] = c as a.opIndexAssign(c).

---
struct Foo
{
    int payload;
    auto ref opSlice(size_t start, size_t end)
    {
        return this;
    }
    auto opIndexAssign(T)(T elem, Foo foo)
    {
        pragma(msg, "opIndexAssign");
        return this;
    }
}

void main(string[] args)
{
    Foo foo;
    pragma(msg, typeof(foo[0..2]));
    foo[0..2] = 3;
}
---

However, it fails with

> test.d(20): Error: cannot implicitly convert expression 3 of type int to Foo


AFAICT there's no reason why this lowering should fail (and at the very least,
the error message needs to be improved).
As a workaround the legacy opSliceAssign can be used and looking at Phobos only
opSliceAssign is used and there's no use of this specific newer opIndexAssign
lowering.

--