https://issues.dlang.org/show_bug.cgi?id=13114
Issue ID: 13114 Summary: old opCmp requirement for AA keys should be detected for classes Product: D Version: D2 Hardware: x86 OS: Mac OS X Status: NEW Keywords: accepts-invalid Severity: regression Priority: P1 Component: DMD Assignee: nob...@puremagic.com Reporter: schvei...@yahoo.com CC: k.hara...@gmail.com Like https://issues.dlang.org/show_bug.cgi?id=13074, the same problem exists for classes. For example: import std.stdio; import std.conv; class C { this(int x, int y) pure {this.x = x; this.y = y;} int x; int y; //override bool opEquals(Object other) { if(auto o = cast(C)other) {return x == o.x;} return false;} override int opCmp(Object other) { if(auto o = cast(C)other) {return x < o.x ? -1 : x > o.x ? 1 : 0;} return -1;} override hash_t toHash() const { return x; } override string toString() const { return "{" ~ x.to!string ~ ", " ~ y.to!string ~ "}";} } void main() { const c1 = new C(1,1); const c2 = new C(1,2); const c3 = new C(2,1); const c4 = new C(2,2); bool[const(C)] arr; arr[c1] = true; arr[c2] = true; arr[c3] = true; arr[c4] = true; writeln(arr); } Under 2.065, this prints: [{1, 1}:true, {2, 1}:true] Under git head (even after the fix for issue 13074), this compiles and prints: [{1, 1}:true, {1, 2}:true, {2, 1}:true, {2, 2}:true] Note, there are going to be cases that we cannot detect. For example, bool[Object] would compile perfectly fine, but if you used a C instance as a key, it would have the same problem. For that, we would need a runtime check. I don't know if it's worth making a fix for that, it would really entail never allowing overriding opCmp without also overriding opEquals. That may be a bridge too far. But we should still fix the easy case (I hope it's easy!) --