I don't know if this is a bug, or if here D/DMD is working as designed. I am not sure. This code shows that floating point NaNs are not tested with == inside associative arrays (because NaNs != NaNs): import std.stdio: writeln; void main() { int[double] aa; aa[double.nan] = 1; writeln(aa); aa[double.nan] = 2; writeln(aa); } Output DMD 2.059beta: [nan:1] [nan:2] Python uses == to compare dict (associative array) keys, so NaNs can't overwrite each other: >>> a = {} >>> a[float("nan")] = 1 >>> a {nan: 1} >>> a[float("nan")] = 2 >>> a {nan: 1, nan: 2} So maybe DMD has to act as Python in this case.
This is an AA implementation bug. Internally, AA's use bitwise comparison, which is wrong in many cases.
Actually, this bug has nothing to do with AA's. The problem is that double's typeinfo.equals and typeinfo.compare does not respect NaNs: import std.stdio: writeln; void main() { double x = double.nan, y = double.nan; writeln(x == y); // prints false (OK) writeln(typeid(double).equals(&x, &y)); // prints true (WRONG) writeln(typeid(double).compare(&x, &y)); // prints 0 (WRONG) }
*** This issue has been marked as a duplicate of issue 5999 ***