diff options
-rw-r--r-- | compiler/lambdalifting.nim | 24 | ||||
-rw-r--r-- | tests/iter/t2closureiters.nim | 14 |
2 files changed, 29 insertions, 9 deletions
diff --git a/compiler/lambdalifting.nim b/compiler/lambdalifting.nim index 692d9265b..8d4badb4e 100644 --- a/compiler/lambdalifting.nim +++ b/compiler/lambdalifting.nim @@ -240,16 +240,22 @@ proc liftIterSym*(n: PNode; owner: PSym): PNode = result = newNodeIT(nkStmtListExpr, n.info, n.typ) let hp = getHiddenParam(iter) - let env = newSym(skLet, iter.name, owner, n.info) - env.typ = hp.typ - env.flags = hp.flags - var v = newNodeI(nkVarSection, n.info) - addVar(v, newSymNode(env)) - result.add(v) + var env: PNode + if owner.isIterator: + let it = getHiddenParam(owner) + addUniqueField(it.typ.sons[0], hp) + env = indirectAccess(newSymNode(it), hp, hp.info) + else: + let e = newSym(skLet, iter.name, owner, n.info) + e.typ = hp.typ + e.flags = hp.flags + env = newSymNode(e) + var v = newNodeI(nkVarSection, n.info) + addVar(v, env) + result.add(v) # add 'new' statement: - let envAsNode = env.newSymNode - result.add newCall(getSysSym"internalNew", envAsNode) - result.add makeClosure(iter, envAsNode, n.info) + result.add newCall(getSysSym"internalNew", env) + result.add makeClosure(iter, env, n.info) proc freshVarForClosureIter*(s, owner: PSym): PNode = let envParam = getHiddenParam(owner) diff --git a/tests/iter/t2closureiters.nim b/tests/iter/t2closureiters.nim new file mode 100644 index 000000000..ceb24548c --- /dev/null +++ b/tests/iter/t2closureiters.nim @@ -0,0 +1,14 @@ +discard """ + output: '''1''' +""" +# bug #3837 + +iterator t1(): int {.closure.} = + yield 1 + +iterator t2(): int {.closure.} = + for i in t1(): + yield i + +for i in t2(): + echo $i |