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.
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 }
http://www.dsource.org/projects/dmd/changeset/600