The problem is in implicitConvTo() and implicitCastTo(). They call optimize(), but don't save the result.
optimize() can generate an error message, and return an ErrorExp when an array bounds error occurs.
It should be called BEFORE implicitConvTo, instead of inside it.
There are many cases of this, here are some examples:
void example()
{
char c = "abcdef"[17];
char[7] x = "abc"[12];
int ww = "abc"["afds"[9]];
}
diag.d(4): Error: string index 17 is out of bounds [0 .. 6]
diag.d(4): Error: string index 17 is out of bounds [0 .. 6]
diag.d(5): Error: string index 12 is out of bounds [0 .. 3]
diag.d(5): Error: string index 12 is out of bounds [0 .. 3]
diag.d(5): Error: string index 12 is out of bounds [0 .. 3]
diag.d(5): Error: string index 12 is out of bounds [0 .. 3]
diag.d(6): Error: string index 9 is out of bounds [0 .. 4]
diag.d(6): Error: string index 9 is out of bounds [0 .. 4]
Comment #1 by clugdbug — 2013-08-27T11:52:20Z
A couple more examples:
void bug10910(string y) {}
char example()
{
char c = "abcdef"[17];
char [7] x = "abc"[12];
int ww = "abc"["dsdffg"[9]];
int m = new int["as"[218]];
auto aa = [0:0];
aa.remove("dgffs"[356]);
bug10910("sdgdf"[14..16]);
return c;
}
The last line gives a particularly silly error message:
junk.d(80): Error: string slice [14 .. 16] is out of bounds
junk.d(80): Error: function junk.bug10910 (string y) is not callable using argument types (string)
Converting string to string is not exactly rocket science.
Comment #2 by k.hara.pg — 2015-01-16T07:44:23Z
*** Issue 12943 has been marked as a duplicate of this issue. ***