Nim/tests/discard/tdiscardable.nim
ringabout 9323cb7b2a
enforce void for nkWhileStmt [backport: 2.0] (#21170)
enforce void for nkWhileStmt
2022-12-24 10:37:32 +01:00

112 lines
1.7 KiB
Nim

discard """
output: '''
tdiscardable
1
1
something defered
something defered
'''
"""
echo "tdiscardable"
# Test the discardable pragma
proc p(x, y: int): int {.discardable.} =
return x + y
# test that it is inherited from generic procs too:
proc q[T](x, y: T): T {.discardable.} =
return x + y
p(8, 2)
q[float](0.8, 0.2)
# bug #942
template maybeMod(x: SomeInteger, module: Natural): untyped =
if module > 0: x mod module
else: x
proc foo(b: int):int =
var x = 1
result = x.maybeMod(b) # Works fine
proc bar(b: int):int =
result = 1
result = result.maybeMod(b) # Error: value returned by statement has to be discarded
echo foo(0)
echo bar(0)
# bug #9726
proc foo: (proc: int) =
proc bar: int = 1
return bar
discard foo()
# bug #10842
proc myDiscardable(): int {.discardable.} =
discard
proc main1() =
defer:
echo "something defered"
discard myDiscardable()
proc main2() =
defer:
echo "something defered"
myDiscardable()
main1()
main2()
block: # bug #13583
block:
proc hello(): int {.discardable.} = 12
iterator test(): int {.closure.} =
while true:
hello()
let t = test
block:
proc hello(): int {.discardable.} = 12
iterator test(): int {.closure.} =
while true:
block:
yield 12
hello()
let t = test
doAssert t() == 12
block:
proc hello(): int {.discardable.} = 12
iterator test(): int {.closure.} =
while true:
yield 12
hello()
let t = test
doAssert t() == 12
block:
proc bar(): string {.discardable.} =
"15"
proc foo(): int =
while true:
raise newException(ValueError, "check")
12
doAssertRaises(ValueError):
doAssert foo() == 12