summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/lambdalifting.nim6
-rw-r--r--tests/iter/tobj_iter.nim16
2 files changed, 19 insertions, 3 deletions
diff --git a/compiler/lambdalifting.nim b/compiler/lambdalifting.nim
index 6fa95fda2..b7dc277a4 100644
--- a/compiler/lambdalifting.nim
+++ b/compiler/lambdalifting.nim
@@ -719,7 +719,7 @@ proc outerProcSons(o: POuterContext, n: PNode, it: TIter) =
     let x = transformOuterProc(o, n.sons[i], it)
     if x != nil: n.sons[i] = x
 
-proc liftIterSym(n: PNode): PNode =
+proc liftIterSym(n: PNode; owner: PSym): PNode =
   # transforms  (iter)  to  (let env = newClosure[iter](); (iter, env))
   let iter = n.sym
   assert iter.kind == skClosureIterator
@@ -727,7 +727,7 @@ proc liftIterSym(n: PNode): PNode =
   result = newNodeIT(nkStmtListExpr, n.info, n.typ)
   
   let hp = getHiddenParam(iter)
-  let env = newSym(skLet, iter.name, iter.owner, iter.info)
+  let env = newSym(skLet, iter.name, owner, n.info)
   env.typ = hp.typ
   env.flags = hp.flags
   var v = newNodeI(nkVarSection, n.info)
@@ -867,7 +867,7 @@ proc transformOuterProc(o: POuterContext, n: PNode; it: TIter): PNode =
       # XXX why doesn't this work?
       var closure = PEnv(idTableGet(o.lambdasToEnv, local))
       if closure.isNil:
-        return liftIterSym(n)
+        return liftIterSym(n, o.fn)
       else:
         let createdVar = generateIterClosureCreation(o, closure,
                                                      closure.attachedNode)
diff --git a/tests/iter/tobj_iter.nim b/tests/iter/tobj_iter.nim
new file mode 100644
index 000000000..7efcfa2ac
--- /dev/null
+++ b/tests/iter/tobj_iter.nim
@@ -0,0 +1,16 @@
+# bug #2023
+
+{.deadCodeElim:on.}
+
+type
+    Obj = object
+        iter: iterator (): int8 {.closure.}
+
+iterator test(): int8 {.closure.} =
+    yield 7
+
+proc init():Obj=
+    result.iter = test
+
+var o = init()
+echo(o.iter())