fix #20152 Illegal capture of closure iterator, when should be legal (#20607)

This commit is contained in:
Bung
2022-10-21 15:59:05 +08:00
committed by GitHub
parent 84fab7f39b
commit 66cbcaab84
2 changed files with 21 additions and 1 deletions

View File

@@ -458,7 +458,7 @@ proc detectCapturedVars(n: PNode; owner: PSym; c: var DetectionPass) =
else:
discard addField(obj, s, c.graph.cache, c.idgen)
# direct or indirect dependency:
elif (innerProc and s.typ.callConv == ccClosure) or interestingVar(s):
elif (innerProc and not s.isIterator and s.typ.callConv == ccClosure) or interestingVar(s):
discard """
proc outer() =
var x: int

20
tests/closure/t20152.nim Normal file
View File

@@ -0,0 +1,20 @@
discard """
action: compile
"""
proc foo() =
iterator it():int {.closure.} =
yield 1
proc useIter() {.nimcall.} =
var iii = it # <-- illegal capture
doAssert iii() == 1
useIter()
foo()
proc foo2() =
proc bar() = # Local function, but not a closure, because no captures
echo "hi"
proc baz() {.nimcall.} = # Calls local function
bar()
baz()
foo2()