diff options
author | Timothee Cour <timothee.cour2@gmail.com> | 2020-03-28 00:51:16 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-28 08:51:16 +0100 |
commit | cfa1a827dc2c782924e50c92f875277161128490 (patch) | |
tree | c71e4e936e1c62037c09bb708b1fce68c442f1c1 /compiler | |
parent | 95ab9ab75da074fcb60f9f2c0e4ef4eab7624f8b (diff) | |
download | Nim-cfa1a827dc2c782924e50c92f875277161128490.tar.gz |
fix #13730 (#13787)
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/trees.nim | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/compiler/trees.nim b/compiler/trees.nim index cd26b2b4f..9a1186a4f 100644 --- a/compiler/trees.nim +++ b/compiler/trees.nim @@ -26,6 +26,10 @@ proc cyclicTree*(n: PNode): bool = var visited: seq[PNode] = @[] cyclicTreeAux(n, visited) +proc sameFloatIgnoreNan(a, b: BiggestFloat): bool {.inline.} = + ## ignores NaN semantics, but ensures 0.0 == -0.0, see #13730 + cast[uint64](a) == cast[uint64](b) or a == b + proc exprStructuralEquivalent*(a, b: PNode; strictSymEquality=false): bool = if a == b: result = true @@ -39,7 +43,7 @@ proc exprStructuralEquivalent*(a, b: PNode; strictSymEquality=false): bool = result = a.sym.name.id == b.sym.name.id of nkIdent: result = a.ident.id == b.ident.id of nkCharLit..nkUInt64Lit: result = a.intVal == b.intVal - of nkFloatLit..nkFloat64Lit: result = cast[uint64](a.floatVal) == cast[uint64](b.floatVal) + of nkFloatLit..nkFloat64Lit: result = sameFloatIgnoreNan(a.floatVal, b.floatVal) of nkStrLit..nkTripleStrLit: result = a.strVal == b.strVal of nkCommentStmt: result = a.comment == b.comment of nkEmpty, nkNilLit, nkType: result = true @@ -64,7 +68,7 @@ proc sameTree*(a, b: PNode): bool = result = a.sym.name.id == b.sym.name.id of nkIdent: result = a.ident.id == b.ident.id of nkCharLit..nkUInt64Lit: result = a.intVal == b.intVal - of nkFloatLit..nkFloat64Lit: result = cast[uint64](a.floatVal) == cast[uint64](b.floatVal) + of nkFloatLit..nkFloat64Lit: result = sameFloatIgnoreNan(a.floatVal, b.floatVal) of nkStrLit..nkTripleStrLit: result = a.strVal == b.strVal of nkEmpty, nkNilLit, nkType: result = true else: |