discard """
targets: "c cpp"
matrix: "--gc:orc"
"""
import std/[tasks, strformat]
block:
var s = ""
proc `+`(x: int, y: string) =
s.add $x & y
let literal = "Nim"
let t = toTask(521 + literal)
t.invoke()
doAssert s == "521Nim"
block:
var s = ""
proc `!`(x: int) =
s.add $x
let t = toTask !12
t.invoke()
doAssert s == "12"
block:
block:
var called = 0
proc hello(x: static range[1 .. 5]) =
called += x
let b = toTask hello(3)
b.invoke()
doAssert called == 3
b.invoke()
doAssert called == 6
block:
var called = 0
proc hello(x: range[1 .. 5]) =
called += x
let b = toTask hello(3)
b.invoke()
doAssert called == 3
b.invoke()
doAssert called == 6
block:
var called = 0
proc hello(x: 1 .. 5) =
called += x
let b = toTask hello(3)
b.invoke()
doAssert called == 3
b.invoke()
doAssert called == 6
block:
var temp = ""
proc hello(a: int or seq[string]) =
when a is seq[string]:
for s in a:
temp.add s
else:
temp.addInt a
let x = @["1", "2", "3", "4"]
let b = toTask hello(x)
b.invoke()
doAssert temp == "1234"
b.invoke()
doAssert temp == "12341234"
block:
var temp = ""
proc hello(a: int or string) =
when a is string:
temp.add a
let x = "!2"
let b = toTask hello(x)
b.invoke()
doAssert temp == x
block:
var temp = ""
proc hello(a: int or string) =
when a is string:
temp.add a
let x = "!2"
let b = toTask hello(x)
b.invoke()
doAssert temp == x
block:
var x = 0
proc hello(typ: typedesc) =
x += typ(12)
let b = toTask hello(int)
b.invoke()
doAssert x == 12
block:
var temp = ""
proc hello(a: int or seq[string]) =
when a is seq[string]:
for s in a:
temp.add s
let x = @["1", "2", "3", "4"]
let b = toTask hello(x)
b.invoke()
doAssert temp == "1234"
block:
var temp = ""
proc hello(a: int | string) =
when a is string:
temp.add a
let x = "!2"
let b = toTask hello(x)
b.invoke()
doAssert temp == x
block:
var x = 0
proc hello(a: int | string) =
when a is int:
x = a
let b = toTask hello(12)
b.invoke()
doAssert x == 12
block:
var a1: seq[int]
var a2 = 0
proc hello(c: seq[int], a: int) =
a1 = c
a2 = a
let x = 12
var y = @[1, 3, 1, 4, 5, x, 1]
let b = toTask hello(y, 12)
b.invoke()
doAssert a1 == y
doAssert a2 == x
block:
var a1: seq[int]
var a2 = 0
proc hello(c: seq[int], a: int) =
a1 = c
a2 = a
var x = 2
let b = toTask hello(@[1, 3, 1, 4, 5, x, 1], 12)
b.invoke()
doAssert a1 == @[1, 3, 1, 4, 5, x, 1]
doAssert a2 == 12
block:
var a1: array[7, int]
var a2 = 0
proc hello(c: array[7, int], a: int) =
a1 = c
a2 = a
let b = toTask hello([1, 3, 1, 4, 5, 2, 1], 12)
b.invoke()
doAssert a1 == [1, 3, 1, 4, 5, 2, 1]
doAssert a2 == 12
block:
var a1: seq[int]
var a2 = 0
proc hello(c: seq[int], a: int) =
a1 = c
a2 = a
let b = toTask hello(@[1, 3, 1, 4, 5, 2, 1], 12)
b.invoke()
doAssert a1 == @[1, 3, 1, 4, 5, 2, 1]
doAssert a2 == 12
block:
var a1: seq[int]
var a2 = 0
proc hello(a: int, c: seq[int]) =
a1 = c
a2 = a
let b = toTask hello(8, @[1, 3, 1, 4, 5, 2, 1])
b.invoke()
doAssert a1 == @[1, 3, 1, 4, 5, 2, 1]
doAssert a2 == 8
let c = toTask 8.hello(@[1, 3, 1, 4, 5, 2, 1])
c.invoke()
doAssert a1 == @[1, 3, 1, 4, 5, 2, 1]
doAssert a2 == 8
block:
var a1: seq[seq[int]]
var a2: int
proc hello(a: int, c: openArray[seq[int]]) =
a1 = @c
a2 = a
let b = toTask hello(8, @[@[3], @[4], @[5], @[6], @[12], @[7]])
b.invoke()
doAssert a1 == @[@[3], @[4], @[5], @[6], @[12], @[7]]
doAssert a2 == 8
block:
var a1: seq[int]
var a2: int
proc hello(a: int, c: openArray[int]) =
a1 = @c
a2 = a
let b = toTask hello(8, @[3, 4, 5, 6, 12, 7])
b.invoke()
doAssert a1 == @[3, 4, 5, 6, 12, 7]
doAssert a2 == 8
block:
var a1: seq[int]
var a2: int
proc hello(a: int, c: static varargs[int]) =
a1 = @c
a2 = a
let b = toTask hello(8, @[3, 4, 5, 6, 12, 7])
b.invoke()
doAssert a1 == @[3, 4, 5, 6, 12, 7]
doAssert a2 == 8
block:
var a1: seq[int]
var a2: int
proc hello(a: int, c: static varargs[int]) =
a1 = @c
a2 = a
let b = toTask hello(8, [3, 4, 5, 6, 12, 7])
b.invoke()
doAssert a1 == @[3, 4, 5, 6, 12, 7]
doAssert a2 == 8
block:
var a1: seq[int]
var a2: int
proc hello(a: int, c: varargs[int]) =
a1 = @c
a2 = a
let x = 12
let b = toTask hello(8, 3, 4, 5, 6, x, 7)
b.invoke()
doAssert a1 == @[3, 4, 5, 6, 12, 7]
doAssert a2 == 8
block:
var x = 12
proc hello(x: ptr int) =
x[] += 12
let b = toTask hello(addr x)
b.invoke()
doAssert x == 24
let c = toTask x.addr.hello
invoke(c)
doAssert x == 36
block:
type
Test = ref object
id: int
var x = 0
proc hello(a: int, c: static Test) =
x += a
x += c.id
let b = toTask hello(8, Test(id: 12))
b.invoke()
doAssert x == 20
block:
type
Test = object
id: int
var x = 0
proc hello(a: int, c: static Test) =
x += a
x += c.id
let b = toTask hello(8, Test(id: 12))
b.invoke()
doAssert x == 20
block:
var x = 0
proc hello(a: int, c: static seq[int]) =
x += a
for i in c:
x += i
let b = toTask hello(8, @[3, 4, 5, 6, 12, 7])
b.invoke()
doAssert x == 45
block:
var x = 0
proc hello(a: int, c: static array[5, int]) =
x += a
for i in c:
x += i
let b = toTask hello(8, [3, 4, 5, 6, 12])
b.invoke()
doAssert x == 38
block:
var aVal = 0
var cVal = ""
proc hello(a: int, c: static string) =
aVal += a
cVal.add c
var x = 1314
let b = toTask hello(x, "hello")
b.invoke()
doAssert aVal == x
doAssert cVal == "hello"
block:
var aVal = ""
proc hello(a: static string) =
aVal.add a
let b = toTask hello("hello")
b.invoke()
doAssert aVal == "hello"
block:
var aVal = 0
var cVal = ""
proc hello(a: static int, c: static string) =
aVal += a
cVal.add c
let b = toTask hello(8, "hello")
b.invoke()
doAssert aVal == 8
doAssert cVal == "hello"
block:
var aVal = 0
var cVal = 0
proc hello(a: static int, c: int) =
aVal += a
cVal += c
let b = toTask hello(c = 0, a = 8)
b.invoke()
doAssert aVal == 8
doAssert cVal == 0
block:
var aVal = 0
var cVal = 0
proc hello(a: int, c: static int) =
aVal += a
cVal += c
let b = toTask hello(c = 0, a = 8)
b.invoke()
doAssert aVal == 8
doAssert cVal == 0
block:
var aVal = 0
var cVal = 0
proc hello(a: static int, c: static int) =
aVal += a
cVal += c
let b = toTask hello(0, 8)
b.invoke()
doAssert aVal == 0
doAssert cVal == 8
block:
var temp = ""
proc hello(x: int, y: seq[string], d = 134) =
temp = fmt"{x=} {y=} {d=}"
proc main() =
var x = @["23456"]
let t = toTask hello(2233, x)
t.invoke()
doAssert temp == """x=2233 y=@["23456"] d=134"""
main()
block:
var temp = ""
proc hello(x: int, y: seq[string], d = 134) =
temp.add fmt"{x=} {y=} {d=}"
proc ok() =
temp = "ok"
proc main() =
var x = @["23456"]
let t = toTask hello(2233, x)
t.invoke()
t.invoke()
doAssert temp == """x=2233 y=@["23456"] d=134x=2233 y=@["23456"] d=134"""
main()
var x = @["4"]
let m = toTask hello(2233, x, 7)
m.invoke()
doAssert temp == """x=2233 y=@["23456"] d=134x=2233 y=@["23456"] d=134x=2233 y=@["4"] d=7"""
let n = toTask ok()
n.invoke()
doAssert temp == "ok"
block:
var called = 0
block:
proc hello() =
inc called
let a = toTask hello()
invoke(a)
doAssert called == 1
block:
proc hello(a: int) =
inc called, a
let b = toTask hello(13)
let c = toTask hello(a = 14)
b.invoke()
c.invoke()
doAssert called == 28
block:
proc hello(a: int, c: int) =
inc called, a
let b = toTask hello(c = 0, a = 8)
b.invoke()
doAssert called == 36