84 lines
1.2 KiB
Nim
84 lines
1.2 KiB
Nim
discard """
|
|
file: "toverflw.nim"
|
|
output: "ok"
|
|
cmd: "nim $target -d:release $options $file"
|
|
|
|
"""
|
|
# Tests nim's ability to detect overflows
|
|
|
|
{.push overflowChecks: on.}
|
|
|
|
var
|
|
a = high(int)
|
|
b = -2
|
|
overflowDetected = false
|
|
|
|
try:
|
|
writeLine(stdout, b - a)
|
|
except OverflowError:
|
|
overflowDetected = true
|
|
|
|
{.pop.} # overflow check
|
|
|
|
doAssert(overflowDetected)
|
|
|
|
block: # Overflow checks in a proc
|
|
var
|
|
a = high(int)
|
|
b = -2
|
|
overflowDetected = false
|
|
|
|
{.push overflowChecks: on.}
|
|
proc foo() =
|
|
let c = b - a
|
|
{.pop.}
|
|
|
|
try:
|
|
foo()
|
|
except OverflowError:
|
|
overflowDetected = true
|
|
|
|
doAssert(overflowDetected)
|
|
|
|
block: # Overflow checks in a forward declared proc
|
|
var
|
|
a = high(int)
|
|
b = -2
|
|
overflowDetected = false
|
|
|
|
proc foo()
|
|
|
|
{.push overflowChecks: on.}
|
|
proc foo() =
|
|
let c = b - a
|
|
{.pop.}
|
|
|
|
try:
|
|
foo()
|
|
except OverflowError:
|
|
overflowDetected = true
|
|
|
|
doAssert(overflowDetected)
|
|
|
|
block: # Overflow checks doesn't affect fwd declaration
|
|
var
|
|
a = high(int)
|
|
b = -2
|
|
overflowDetected = false
|
|
|
|
{.push overflowChecks: on.}
|
|
proc foo()
|
|
{.pop.}
|
|
|
|
proc foo() =
|
|
let c = b - a
|
|
|
|
try:
|
|
foo()
|
|
except OverflowError:
|
|
overflowDetected = true
|
|
|
|
doAssert(not overflowDetected)
|
|
|
|
|
|
echo "ok"
|