112 lines
1.7 KiB
Nim
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
|