fix #16469 vm float constants: do not conflate -0.0 and 0.0 (#16470)

* fix #16469 vm float constants: do not conflate -0.0 and 0.0

* fix test for 32bit
This commit is contained in:
Timothee Cour
2020-12-27 05:35:01 -08:00
committed by GitHub
parent 0c8ce2dccf
commit 357729639f
2 changed files with 20 additions and 2 deletions

View File

@@ -453,7 +453,12 @@ proc sameConstant*(a, b: PNode): bool =
of nkSym: result = a.sym == b.sym
of nkIdent: result = a.ident.id == b.ident.id
of nkCharLit..nkUInt64Lit: result = a.intVal == b.intVal
of nkFloatLit..nkFloat64Lit: result = a.floatVal == b.floatVal
of nkFloatLit..nkFloat64Lit:
result = cast[uint64](a.floatVal) == cast[uint64](b.floatVal)
# refs bug #16469
# if we wanted to only distinguish 0.0 vs -0.0:
# if a.floatVal == 0.0: result = cast[uint64](a.floatVal) == cast[uint64](b.floatVal)
# else: result = a.floatVal == b.floatVal
of nkStrLit..nkTripleStrLit: result = a.strVal == b.strVal
of nkType, nkNilLit: result = a.typ == b.typ
of nkEmpty: result = true

View File

@@ -15,7 +15,7 @@ echo "Nim: ", f32, " (float)"
let f64: float64 = NaN
echo "Nim: ", f64, " (double)"
block: # issue #10305
block: # bug #10305
# with `-O3 -ffast-math`, generated C/C++ code is not nan compliant
# user can pass `--passC:-ffast-math` if he doesn't care.
proc fun() =
@@ -42,3 +42,16 @@ block: # issue #10305
fun()
fun2(0)
template main() =
# xxx move all tests under here
block: # bug #16469
let a1 = 0.0
let a2 = -0.0
let a3 = 1.0 / a1
let a4 = 1.0 / a2
doAssert a3 == Inf
doAssert a4 == -Inf
doAssert $(a1, a2, a3, a4) == "(0.0, -0.0, inf, -inf)"
static: main()
main()