diff options
author | Yuriy Glukhov <yuriy.glukhov@gmail.com> | 2018-06-07 00:14:56 +0300 |
---|---|---|
committer | Yuriy Glukhov <yuriy.glukhov@gmail.com> | 2018-06-07 00:15:46 +0300 |
commit | fef60716bfbae0f0eda8cf976d5cd4b61f1c5fdd (patch) | |
tree | 0e531f6877859bf8122c5df74eb39442f5e749e0 | |
parent | bf394ed1a1d27d8d38d4bc386946e3442736cd75 (diff) | |
download | Nim-fef60716bfbae0f0eda8cf976d5cd4b61f1c5fdd.tar.gz |
Fixed yield in nkBlockExpr
-rw-r--r-- | compiler/closureiters.nim | 16 | ||||
-rw-r--r-- | tests/iter/tyieldintry.nim | 15 |
2 files changed, 29 insertions, 2 deletions
diff --git a/compiler/closureiters.nim b/compiler/closureiters.nim index 3d86954c2..e8f4d62c1 100644 --- a/compiler/closureiters.nim +++ b/compiler/closureiters.nim @@ -442,7 +442,6 @@ proc lowerStmtListExprs(ctx: var Ctx, n: PNode, needsSplit: var bool): PNode = n[i] = ctx.lowerStmtListExprs(n[i], ns) if ns: - assert(n[0].kind == nkStmtListExpr) result = newNodeI(nkStmtList, n.info) let (st, ex) = exprToStmtList(n[0]) result.add(st) @@ -662,7 +661,6 @@ proc lowerStmtListExprs(ctx: var Ctx, n: PNode, needsSplit: var bool): PNode = c[^1] = ctx.lowerStmtListExprs(c[^1], ns) if ns: needsSplit = true - assert(c[^1].kind == nkStmtListExpr) let (st, ex) = exprToStmtList(c[^1]) result.add(st) c[^1] = ex @@ -748,6 +746,20 @@ proc lowerStmtListExprs(ctx: var Ctx, n: PNode, needsSplit: var bool): PNode = n[0] = ex result.add(n) + of nkBlockExpr: + var ns = false + n[1] = ctx.lowerStmtListExprs(n[1], ns) + if ns: + needsSplit = true + result = newNodeI(nkStmtListExpr, n.info) + result.typ = n.typ + let (st, ex) = exprToStmtList(n[1]) + n.kind = nkBlockStmt + n.typ = nil + n[1] = st + result.add(n) + result.add(ex) + else: for i in 0 ..< n.len: n[i] = ctx.lowerStmtListExprs(n[i], needsSplit) diff --git a/tests/iter/tyieldintry.nim b/tests/iter/tyieldintry.nim index c9e5843b8..3c07736e1 100644 --- a/tests/iter/tyieldintry.nim +++ b/tests/iter/tyieldintry.nim @@ -393,4 +393,19 @@ block: #7969 test(it, 1, 2, 3) +block: # yield in blockexpr + type + SomeObj = object + id: int + + iterator it(): int {.closure.} = + yield(block: + checkpoint(1) + yield 2 + 3 + ) + + test(it, 1, 2, 3) + + echo "ok" |