* fix #10305 nim cpp is now nan-correct at CT * add example where simply `nim cpp -d:release` would exhibit nan bug
This commit is contained in:
parent
9a92bc15b3
commit
4355f23ee5
3 changed files with 35 additions and 4 deletions
|
|
@ -63,8 +63,8 @@ compiler gcc:
|
||||||
result = (
|
result = (
|
||||||
name: "gcc",
|
name: "gcc",
|
||||||
objExt: "o",
|
objExt: "o",
|
||||||
optSpeed: " -O3 -ffast-math ",
|
optSpeed: " -O3 ",
|
||||||
optSize: " -Os -ffast-math ",
|
optSize: " -Os ",
|
||||||
compilerExe: "gcc",
|
compilerExe: "gcc",
|
||||||
cppCompiler: "g++",
|
cppCompiler: "g++",
|
||||||
compileTmpl: "-c $options $include -o $objfile $file",
|
compileTmpl: "-c $options $include -o $objfile $file",
|
||||||
|
|
@ -88,8 +88,8 @@ compiler nintendoSwitchGCC:
|
||||||
result = (
|
result = (
|
||||||
name: "switch_gcc",
|
name: "switch_gcc",
|
||||||
objExt: "o",
|
objExt: "o",
|
||||||
optSpeed: " -O3 -ffast-math ",
|
optSpeed: " -O3 ",
|
||||||
optSize: " -Os -ffast-math ",
|
optSize: " -Os ",
|
||||||
compilerExe: "aarch64-none-elf-gcc",
|
compilerExe: "aarch64-none-elf-gcc",
|
||||||
cppCompiler: "aarch64-none-elf-g++",
|
cppCompiler: "aarch64-none-elf-g++",
|
||||||
compileTmpl: "-w -MMD -MP -MF $dfile -c $options $include -o $objfile $file",
|
compileTmpl: "-w -MMD -MP -MF $dfile -c $options $include -o $objfile $file",
|
||||||
|
|
|
||||||
|
|
@ -347,6 +347,9 @@ complete list.
|
||||||
Define Effect
|
Define Effect
|
||||||
====================== =========================================================
|
====================== =========================================================
|
||||||
``release`` Turns off runtime checks and turns on the optimizer.
|
``release`` Turns off runtime checks and turns on the optimizer.
|
||||||
|
More aggressive optimizations are possible, eg:
|
||||||
|
``--passC:-ffast-math`` (but see issue #10305)
|
||||||
|
``--stacktrace:off``
|
||||||
``useWinAnsi`` Modules like ``os`` and ``osproc`` use the Ansi versions
|
``useWinAnsi`` Modules like ``os`` and ``osproc`` use the Ansi versions
|
||||||
of the Windows API. The default build uses the Unicode
|
of the Windows API. The default build uses the Unicode
|
||||||
version.
|
version.
|
||||||
|
|
|
||||||
|
|
@ -14,3 +14,31 @@ echo "Nim: ", f32, " (float)"
|
||||||
|
|
||||||
let f64: float64 = NaN
|
let f64: float64 = NaN
|
||||||
echo "Nim: ", f64, " (double)"
|
echo "Nim: ", f64, " (double)"
|
||||||
|
|
||||||
|
block: # issue #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() =
|
||||||
|
# this was previously failing at compile time with a nim compiler
|
||||||
|
# that was compiled with `nim cpp -d:release`
|
||||||
|
let a1 = 0.0
|
||||||
|
let a = 0.0/a1
|
||||||
|
let b1 = a == 0.0
|
||||||
|
let b2 = a == a
|
||||||
|
doAssert not b1
|
||||||
|
doAssert not b2
|
||||||
|
|
||||||
|
proc fun2(i: int) =
|
||||||
|
# this was previously failing simply with `nim cpp -d:release`; the
|
||||||
|
# difference with above example is that optimization (const folding) can't
|
||||||
|
# take place in this example to hide the non-compliant nan bug.
|
||||||
|
let a = 0.0/(i.float)
|
||||||
|
let b1 = a == 0.0
|
||||||
|
let b2 = a == a
|
||||||
|
doAssert not b1
|
||||||
|
doAssert not b2
|
||||||
|
|
||||||
|
static: fun()
|
||||||
|
fun()
|
||||||
|
fun2(0)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue