June 22, 2018 [Issue 19015] New: arr[i..i] = c doesn't lower to a.opIndexAssign(c, a.opSlice(i, j)) | ||||
---|---|---|---|---|
| ||||
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. -- |
Copyright © 1999-2021 by the D Language Foundation