3041 – Array slices can be compared to their element type: bad codegen or ICE

D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 3041 - Array slices can be compared to their element type: bad codegen or ICE
Summary: Array slices can be compared to their element type: bad codegen or ICE
Status: RESOLVED FIXED
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D1 (retired)
Hardware: All All
: P3 major
Assignee: Walter Bright
URL:
Keywords: accepts-invalid, ice-on-invalid-code, patch, wrong-code
Depends on:
Blocks:
Reported: 2009年05月31日 05:58 UTC by Matti Niemenmaa
Modified: 2014年04月18日 09:12 UTC (History)
1 user (show)

See Also:


Attachments
Add an attachment (proposed patch, testcase, etc.)

Note You need to log in before you can comment on or make changes to this issue.
Description Matti Niemenmaa 2009年05月31日 05:58:06 UTC
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 Don 2009年06月08日 16:17:25 UTC
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 Walter Bright 2009年10月07日 01:20:22 UTC
The error detection really needs to go in the front end, in EqualExp::semantic(), etc. I'll fix.
Comment 3 Walter Bright 2009年10月13日 13:45:26 UTC
Fixed dmd 1.049 and 2.034


AltStyle によって変換されたページ (->オリジナル) /