Comment #0 by matti.niemenmaa+dbugzilla — 2009-05-31T05:58:06Z
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'
Comment #1 by clugdbug — 2009-06-08T16:17:25Z
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;
*/
Comment #2 by bugzilla — 2009-10-07T01:20:22Z
The error detection really needs to go in the front end, in EqualExp::semantic(), etc. I'll fix.