diff options
author | Bung <crc32@qq.com> | 2022-11-23 03:05:16 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-11-22 20:05:16 +0100 |
commit | 354eb2a86c75335c34cab8074b8b3532f09ecccf (patch) | |
tree | 43ab59e153a06e1ebe30740240a61fe17b5b8462 | |
parent | fc37554795f02924cded5500a93233e28d6634db (diff) | |
download | Nim-354eb2a86c75335c34cab8074b8b3532f09ecccf.tar.gz |
fix #20866 [ORC] Bad codegen for global pointer to iterator (#20876)
-rw-r--r-- | compiler/semstmts.nim | 7 | ||||
-rw-r--r-- | tests/global/t3505.nim | 10 |
2 files changed, 14 insertions, 3 deletions
diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index 774b50d7b..ab8c23ba4 100644 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -593,9 +593,12 @@ proc msgSymChoiceUseQualifier(c: PContext; n: PNode; note = errGenerated) = template isLocalVarSym(n: PNode): bool = n.kind == nkSym and - n.sym.kind in {skVar, skLet} and not + (n.sym.kind in {skVar, skLet} and not ({sfGlobal, sfPure} <= n.sym.flags or - sfCompileTime in n.sym.flags) + sfCompileTime in n.sym.flags) or + n.sym.kind in {skProc, skFunc, skIterator} and + sfGlobal notin n.sym.flags + ) proc usesLocalVar(n: PNode): bool = for z in 1 ..< n.len: diff --git a/tests/global/t3505.nim b/tests/global/t3505.nim index f320ec4f5..437a02ae6 100644 --- a/tests/global/t3505.nim +++ b/tests/global/t3505.nim @@ -4,7 +4,7 @@ action: "reject" nimout: ''' t3505.nim(22, 22) Error: cannot assign local to global variable t3505.nim(31, 28) Error: cannot assign local to global variable - +t3505.nim(39, 29) Error: cannot assign local to global variable @@ -31,3 +31,11 @@ proc main() = var x {.global.} = initX2(initX(f)) main() + +# issue #20866 +proc foo2() = + iterator bar() {.closure.} = + discard + var g {.global.} = rawProc(bar) + +foo2() \ No newline at end of file |