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 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
|
discard """
targets: "c cpp js"
"""
import std/[assertions, sequtils]
proc test() =
block:
proc ok(_, _, a: int): int =
doAssert not compiles(_)
a
doassert ok(4, 2, 5) == 5
block:
proc ok(_: int, _: int, a: int): int = a
doAssert ok(4, 2, 5) == 5
block:
proc ok(_: int, _: float, a: int): int = a
doAssert ok(1, 2.0, 5) == 5
block:
proc ok(_: int, _: float, _: string, a: int): int = a
doAssert ok(1, 2.6, "5", 5) == 5
block:
proc ok[T](_, _, a: T): T =
doAssert not compiles(_)
a
doAssert ok(4, 2, 5) == 5
doAssert ok("a", "b", "c") == "c"
doAssert not compiles(ok(1, 2, "a"))
block:
let ok = proc (_, _, a: int): int =
doAssert not compiles(_)
a
doAssert ok(4, 2, 5) == 5
block:
proc foo(lam: proc (_, _, a: int): int): int =
lam(4, 2, 5)
doAssert foo(proc (_, _, a: auto): auto =
doAssert not compiles(_)
a) == 5
block:
iterator fn(_, _: int, c: int): int = yield c
doAssert toSeq(fn(1,2,3)) == @[3]
block:
template ok(_, _, a: int): int = a
doAssert ok(4, 2, 5) == 5
block:
doAssert not (compiles do:
template bad(_: int): int = _
discard bad(3))
block:
template ok(_: int, _: int, a: int): int = a
doAssert ok(4, 2, 5) == 5
block:
template ok(_: int, _: float, a: int): int = a
doAssert ok(1, 2.0, 5) == 5
block:
template ok(_: int, _: float, _: string, a: int): int = a
doAssert ok(1, 2.6, "5", 5) == 5
block:
template main2() =
iterator fn(_, _: int, c: int): int = yield c
main2()
block:
template main =
proc foo(_: int) =
let a = _
doAssert not compiles(main())
block: # generic params
doAssert not (compiles do:
proc foo[_](t: typedesc[_]): seq[_] = @[default(_)]
doAssert foo[int]() == 0)
block:
proc foo[_, _](): int = 123
doAssert foo[int, bool]() == 123
block:
proc foo[T; U](_: typedesc[T]; _: typedesc[U]): (T, U) = (default(T), default(U))
doAssert foo(int, bool) == (0, false)
proc closureTest() =
var x = 0
block:
proc foo(_, _: int) = x += 5
foo(1, 2)
doAssert x == 5
block:
proc foo(_: int, _: float) = x += 5
foo(1, 2)
doAssert x == 10
block:
proc foo(_: int, _: float, _: string) = x += 5
foo(1, 2, "5")
doAssert x == 15
static: test()
test()
when not defined(js):
static: closureTest()
closureTest()
|