The following invalid code is accepted by DMD 1.045: void main() { int[1] a = 1; int b = 1; assert (a[] == b); } The assertion fails, meaning that some nonsense code has been generated. According to the spec the above is invalid: == isn't an array operation. Other comparison operators like < and >= are also incorrectly accepted. The following variation gives "Internal error: ../ztc/cgcod.c 1554": void main() { int[] a = [1]; int b = 1; assert (a[] == b); } If the slice is removed from the assertion, making it read just "a == b", neither example compiles, as expected: arst.d(4): Error: incompatible types for ((a) == (b)): 'int[1u]' and 'int' arst.d(4): Error: incompatible types for ((a) == (b)): 'int[]' and 'int'
Root cause: CmpExp::toElem() and EqualExp::toElem() have a special case for a[] == b[], but not for a[]==b. --- e2ir.c (revision 27) +++ e2ir.c (working copy) @@ -2191,6 +2191,14 @@ e = el_bin(eop, TYint, e, el_long(TYint, 0)); el_setLoc(e,loc); } + else if ((int)eop > 1 && + (t1->ty == Tarray || t1->ty == Tsarray) || + (t2->ty == Tarray || t2->ty == Tsarray)) + { + error("Invalid array comparison operation"); + e = toElemBin(irs, eop); + return e; + } else { if ((int)eop <= 1) @@ -2285,6 +2293,14 @@ e = el_bin(OPxor, TYint, e, el_long(TYint, 1)); el_setLoc(e,loc); } + else if ((t1->ty == Tarray || t1->ty == Tsarray) || + (t2->ty == Tarray || t2->ty == Tsarray)) + { + error("Invalid array equality operation"); + e = toElemBin(irs, eop); + return e; + + } else e = toElemBin(irs, eop); return e; */
The error detection really needs to go in the front end, in EqualExp::semantic(), etc. I'll fix.
Fixed dmd 1.049 and 2.034
AltStyle によって変換されたページ (->オリジナル) / アドレス: モード: デフォルト 音声ブラウザ ルビ付き 配色反転 文字拡大 モバイル