diff options
-rw-r--r-- | compiler/closureiters.nim | 6 | ||||
-rw-r--r-- | tests/iter/tyieldintry.nim | 13 |
2 files changed, 16 insertions, 3 deletions
diff --git a/compiler/closureiters.nim b/compiler/closureiters.nim index 71c755d6c..e3e9c2236 100644 --- a/compiler/closureiters.nim +++ b/compiler/closureiters.nim @@ -678,7 +678,7 @@ proc lowerStmtListExprs(ctx: var Ctx, n: PNode, needsSplit: var bool): PNode = n[0] = ex result.add(n) - of nkCast, nkHiddenStdConv, nkHiddenSubConv, nkConv: + of nkCast, nkHiddenStdConv, nkHiddenSubConv, nkConv, nkObjDownConv: var ns = false for i in 0 ..< n.len: n[i] = ctx.lowerStmtListExprs(n[i], ns) @@ -687,9 +687,9 @@ proc lowerStmtListExprs(ctx: var Ctx, n: PNode, needsSplit: var bool): PNode = needsSplit = true result = newNodeI(nkStmtListExpr, n.info) result.typ = n.typ - let (st, ex) = exprToStmtList(n[1]) + let (st, ex) = exprToStmtList(n[^1]) result.add(st) - n[1] = ex + n[^1] = ex result.add(n) of nkAsgn, nkFastAsgn: diff --git a/tests/iter/tyieldintry.nim b/tests/iter/tyieldintry.nim index 6f0acb169..48d05e866 100644 --- a/tests/iter/tyieldintry.nim +++ b/tests/iter/tyieldintry.nim @@ -403,5 +403,18 @@ block: # yield in blockexpr test(it, 1, 2, 3) +block: #8851 + type + Foo = ref object of RootObj + template someFoo(): Foo = + var f: Foo + yield 1 + f + iterator it(): int {.closure.} = + var o: RootRef + o = someFoo() + + test(it, 1) + echo "ok" |