diff options
-rw-r--r-- | compiler/lambdalifting.nim | 6 | ||||
-rw-r--r-- | tests/iter/tobj_iter.nim | 16 |
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()) |