Bug 4155 – return of NaN to temporary fails equality test

Status
RESOLVED
Resolution
FIXED
Severity
critical
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
x86
OS
All
Creation time
2010-05-03T09:06:00Z
Last change time
2015-06-09T05:10:44Z
Keywords
pull, wrong-code
Assigned to
yebblies
Creator
melvin.curran

Comments

Comment #0 by melvin.curran — 2010-05-03T09:06:03Z
The problem is found in both DMD 1.059 and 2.044 and is demonstrated by the following program - every answer should be false, but that is not the case. import std.stdio; T getnan(T)() { return T.nan; } void main() { float f = 0.0; double d = 0.0; real r = 0.0; writefln("before assigning NaN, float:%s, double:%s, real:%s", f, d, r); f = getnan!(float)(); d = getnan!(double)(); r = getnan!(real)(); writefln(" float test, literal:%s, assign:%s, temporary:%s", (float.nan == 0), (f == 0), (getnan!(float)() == 0)); writefln("double test, literal:%s, assign:%s, temporary:%s", (double.nan == 0), (d == 0), (getnan!(double)() == 0)); writefln(" real test, literal:%s, assign:%s, temporary:%s", (real.nan == 0), (r == 0), (getnan!(real)() == 0)); }
Comment #1 by yebblies — 2012-02-23T06:42:51Z
https://github.com/D-Programming-Language/dmd/pull/760 When T is a float or double, and in memory, dmd loads it to gp registers, doubles it, then tests for zero. When it's in ST(0), dmd uses fucompp to test but the code that tests the flags is unaware of this and doesn't check the zero flag to see if it was a nan comparison.
Comment #2 by yebblies — 2012-02-26T08:37:25Z
Comment #3 by github-bugzilla — 2012-04-27T18:21:45Z
Commit pushed to dmd-1.x at https://github.com/D-Programming-Language/dmd https://github.com/D-Programming-Language/dmd/commit/ac10c87904a73311eba93143d1aa92988227be49 add yebblies fix Issue 4155 - return of NaN to temporary fails equality test
Comment #4 by github-bugzilla — 2012-04-27T18:21:57Z
Commit pushed to master at https://github.com/D-Programming-Language/dmd https://github.com/D-Programming-Language/dmd/commit/e1d597875183f58464ac44b8eb5d3d28f1f90170 add yebblies fix Issue 4155 - return of NaN to temporary fails equality test