Code to create ICE:
void main()
{
int[] foo;
int y = 2;
int[] c = y + foo[];
}
$ dmd test.d
Internal error: ../ztc/cgcod.c 1596
The same error occurs if using the operators +, -, or %.
The proper error is given with operators * and /. (Proper error I think is what is being given in 1.061)
In 1.061, I would receive this error:
test.d(5): Error: Array operation y + foo[] not implemented
This seems to be because functions AddExp::toElem, MinExp::toElem and ModExp::toElem in e2ir.c do not have the code that checks for a non-valid array. The code from these was taken out in 1.062.
The code seemed to be added for MulExp and DivExp because of this issue:
http://d.puremagic.com/issues/show_bug.cgi?id=3522
but was later taken out of AddExp and MinExp.
Perhaps this code in BinExp::toElem:
if ((tb1->ty == Tarray || tb1->ty == Tsarray) &&
(tb2->ty == Tarray || tb2->ty == Tsarray) &&
op != OPeq
)
Should be:
if ((tb1->ty == Tarray || tb1->ty == Tsarray) ||
(tb2->ty == Tarray || tb2->ty == Tsarray) &&
op != OPeq
)
That might catch array ops errors for all of the xxxExp types.
Comment #1 by clugdbug — 2010-08-04T00:13:42Z
That suggested patch is almost right. It fails even for the test case, though! It needs to allow void assignments. This patch below passes the test suite.
PATCH: e2ir.c, BinExp::toElemBin(), line 2004.
if ((tb1->ty == Tarray || tb1->ty == Tsarray ||
tb2->ty == Tarray || tb2->ty == Tsarray) &&
tb2->ty != Tvoid &&
op != OPeq && op != OPandand && op != OPoror
)
{
error("Array operation %s not implemented", toChars());
return el_long(type->totym(), 0); // error recovery
}