diff options
author | cooldome <cdome@bk.ru> | 2020-04-20 14:57:36 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-20 15:57:36 +0200 |
commit | 65c5367dc1c29d01f00dbc2bcfb574af5f3334fa (patch) | |
tree | e8e919192a2c00ea5cdfd2afdb750ec63bba6959 | |
parent | ba0af0f827d97532516e4c2acc1fdbb9cdba7b61 (diff) | |
download | Nim-65c5367dc1c29d01f00dbc2bcfb574af5f3334fa.tar.gz |
Fixes #14014 (#14029)
* add test * improve test * progress * fix #14014 * fix bug Co-authored-by: cooldome <ariabushenko@bk.ru>
-rw-r--r-- | compiler/spawn.nim | 9 | ||||
-rw-r--r-- | tests/parallel/tsysspawn.nim | 35 |
2 files changed, 41 insertions, 3 deletions
diff --git a/compiler/spawn.nim b/compiler/spawn.nim index c60dd934c..8b1f89e15 100644 --- a/compiler/spawn.nim +++ b/compiler/spawn.nim @@ -201,8 +201,11 @@ proc setupArgsForConcurrency(g: ModuleGraph; n: PNode; objType: PType; # we pick n's type here, which hopefully is 'tyArray' and not # 'tyOpenArray': var argType = n[i].typ.skipTypes(abstractInst) - if i < formals.len and formals[i].typ.kind in {tyVar, tyLent}: - localError(g.config, n[i].info, "'spawn'ed function cannot have a 'var' parameter") + if i < formals.len: + if formals[i].typ.kind in {tyVar, tyLent}: + localError(g.config, n[i].info, "'spawn'ed function cannot have a 'var' parameter") + if formals[i].typ.kind in {tyTypeDesc, tyStatic}: + continue #elif containsTyRef(argType): # localError(n[i].info, "'spawn'ed function cannot refer to 'ref'/closure") @@ -226,6 +229,8 @@ proc setupArgsForParallelism(g: ModuleGraph; n: PNode; objType: PType; # for correctness: These are called 'threadLocal' here. for i in 1..<n.len: let n = n[i] + if i < formals.len and formals[i].typ.kind in {tyStatic, tyTypeDesc}: + continue let argType = skipTypes(if i < formals.len: formals[i].typ else: n.typ, abstractInst) #if containsTyRef(argType): diff --git a/tests/parallel/tsysspawn.nim b/tests/parallel/tsysspawn.nim index 7244a5ee6..09a77b358 100644 --- a/tests/parallel/tsysspawn.nim +++ b/tests/parallel/tsysspawn.nim @@ -1,6 +1,10 @@ discard """ output: '''4 -8''' +8 +(a: 1) +2 +2 +''' cmd: "nim $target --threads:on $options $file" """ @@ -29,3 +33,32 @@ sync() echo x echo y + + +#-------------------------------------------------------- +# issue #14014 + +import threadpool + +type A = object + a: int + +proc f(t: typedesc): t = + t(a:1) + +let r = spawn f(A) +echo ^r + +proc f2(x: static[int]): int = + x + +let r2 = spawn f2(2) +echo ^r2 + +type statint = static[int] + +proc f3(x: statint): int = + x + +let r3 = spawn f3(2) +echo ^r3 |