[Issue 19015] New: arr[i..i] = c doesn't lower to a.opIndexAssign(c, a.opSlice(i, j))
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Fri Jun 22 17:19:51 UTC 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 at puremagic.com
Reporter: greensunny12 at 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.
--
More information about the Digitalmars-d-bugs
mailing list