Bug 4578 – Regression(2.047,1.062): ICE(cgcod.c): var+arr[]

Status
RESOLVED
Resolution
FIXED
Severity
regression
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
Other
OS
All
Creation time
2010-08-03T15:52:00Z
Last change time
2015-06-09T05:11:53Z
Keywords
ice-on-invalid-code, patch
Assigned to
nobody
Creator
baseball.mjp

Comments

Comment #0 by baseball.mjp — 2010-08-03T15:52:45Z
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 }
Comment #2 by bugzilla — 2010-08-05T11:16:41Z