diff options
-rw-r--r-- | compiler/pragmas.nim | 4 | ||||
-rw-r--r-- | compiler/semtypes.nim | 8 | ||||
-rw-r--r-- | lib/system/threads.nim | 6 |
3 files changed, 9 insertions, 9 deletions
diff --git a/compiler/pragmas.nim b/compiler/pragmas.nim index 9a12fa7fe..f4109b26d 100644 --- a/compiler/pragmas.nim +++ b/compiler/pragmas.nim @@ -751,7 +751,9 @@ proc singlePragma(c: PContext, sym: PSym, n: PNode, i: int, noVal(it) incl(sym.flags, sfThread) incl(sym.flags, sfProcvar) - if sym.typ != nil: incl(sym.typ.flags, tfThread) + if sym.typ != nil: + incl(sym.typ.flags, tfThread) + if sym.typ.callConv == ccClosure: sym.typ.callConv = ccDefault of wGcSafe: noVal(it) if sym.kind != skType: incl(sym.flags, sfThread) diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim index ed576f85e..5f47bca5c 100644 --- a/compiler/semtypes.nim +++ b/compiler/semtypes.nim @@ -1141,14 +1141,12 @@ proc semProcTypeWithScope(c: PContext, n: PNode, checkSonsLen(n, 2) openScope(c) result = semProcTypeNode(c, n.sons[0], nil, prev, kind, isType=true) + # start with 'ccClosure', but of course pragmas can overwrite this: + result.callConv = ccClosure # dummy symbol for `pragma`: var s = newSymS(kind, newIdentNode(getIdent("dummy"), n.info), c) s.typ = result - if n.sons[1].kind == nkEmpty or n.sons[1].len == 0: - if result.callConv == ccDefault: - result.callConv = ccClosure - #Message(n.info, warnImplicitClosure, renderTree(n)) - else: + if n.sons[1].kind != nkEmpty and n.sons[1].len > 0: pragma(c, s, n.sons[1], procTypePragmas) when useEffectSystem: setEffectsForProcType(result, n.sons[1]) closeScope(c) diff --git a/lib/system/threads.nim b/lib/system/threads.nim index 583e3ae86..838f6e16b 100644 --- a/lib/system/threads.nim +++ b/lib/system/threads.nim @@ -419,7 +419,7 @@ when false: when hostOS == "windows": proc createThread*[TArg](t: var Thread[TArg], - tp: proc (arg: TArg) {.thread.}, + tp: proc (arg: TArg) {.thread, nimcall.}, param: TArg) = ## creates a new thread `t` and starts its execution. Entry point is the ## proc `tp`. `param` is passed to `tp`. `TArg` can be ``void`` if you @@ -441,7 +441,7 @@ when hostOS == "windows": else: proc createThread*[TArg](t: var Thread[TArg], - tp: proc (arg: TArg) {.thread.}, + tp: proc (arg: TArg) {.thread, nimcall.}, param: TArg) = ## creates a new thread `t` and starts its execution. Entry point is the ## proc `tp`. `param` is passed to `tp`. `TArg` can be ``void`` if you @@ -464,7 +464,7 @@ else: cpusetIncl(cpu.cint, s) setAffinity(t.sys, sizeof(s), s) -proc createThread*(t: var Thread[void], tp: proc () {.thread.}) = +proc createThread*(t: var Thread[void], tp: proc () {.thread, nimcall.}) = createThread[void](t, tp) proc threadId*[TArg](t: var Thread[TArg]): ThreadId[TArg] {.inline.} = |