summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/semstmts.nim7
-rw-r--r--tests/global/t3505.nim10
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