123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- 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
|