1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
|
import std/assertions
proc main =
iterator closureIter(): int {.closure.} =
yield 1
yield 2
iterator inlineIter(): int {.inline.} =
yield 1
yield 2
proc procNotIter(): int = 1
doAssert closureIter is iterator
doAssert inlineIter is iterator
doAssert procNotIter isnot iterator
doAssert closureIter isnot proc
doAssert inlineIter isnot proc
doAssert procNotIter is proc
doAssert typeof(closureIter) is iterator
doAssert typeof(inlineIter) is iterator
doAssert typeof(procNotIter) isnot iterator
doAssert typeof(closureIter) isnot proc
doAssert typeof(inlineIter) isnot proc
doAssert typeof(procNotIter) is proc
block:
proc fn1(iter: iterator {.closure.}) = discard
proc fn2[T: iterator {.closure.}](iter: T) = discard
fn1(closureIter)
fn2(closureIter)
doAssert not compiles(fn1(procNotIter))
doAssert not compiles(fn2(procNotIter))
doAssert not compiles(fn1(inlineIter))
doAssert not compiles(fn2(inlineIter))
block: # concrete iterator type
proc fn1(iter: iterator(): int) = discard
proc fn2[T: iterator(): int](iter: T) = discard
fn1(closureIter)
fn2(closureIter)
doAssert not compiles(fn1(procNotIter))
doAssert not compiles(fn2(procNotIter))
doAssert not compiles(fn1(inlineIter))
doAssert not compiles(fn2(inlineIter))
proc takesNimcall[T: proc {.nimcall.}](p: T) = discard
proc takesClosure[T: proc {.closure.}](p: T) = discard
proc takesAnyProc[T: proc](p: T) = discard
proc nimcallProc(): int {.nimcall.} = 1
proc closureProc(): int {.closure.} = 2
doAssert nimcallProc is proc {.nimcall.}
takesNimcall(nimcallProc)
doAssert closureProc isnot proc {.nimcall.}
doAssert not compiles(takesNimcall(closureProc))
doAssert nimcallProc isnot proc {.closure.}
doAssert not compiles(takesClosure(nimcallProc))
doAssert closureProc is proc {.closure.}
takesClosure(closureProc)
doAssert nimcallProc is proc
takesAnyProc(nimcallProc)
doAssert closureProc is proc
takesAnyProc(closureProc)
block: # supposed to test that sameType works
template ensureNotRedefine(Ty): untyped =
proc foo[T: Ty](x: T) = discard
doAssert not (compiles do:
proc bar[T: Ty](x: T) = discard
proc bar[T: Ty](x: T) = discard)
ensureNotRedefine proc
ensureNotRedefine iterator
ensureNotRedefine proc {.nimcall.}
ensureNotRedefine iterator {.nimcall.}
ensureNotRedefine proc {.closure.}
ensureNotRedefine iterator {.closure.}
main()
|