summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/lambdalifting.nim24
-rw-r--r--tests/iter/t2closureiters.nim14
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