summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorYuriy Glukhov <yuriy.glukhov@gmail.com>2018-06-07 00:14:56 +0300
committerYuriy Glukhov <yuriy.glukhov@gmail.com>2018-06-07 00:15:46 +0300
commitfef60716bfbae0f0eda8cf976d5cd4b61f1c5fdd (patch)
tree0e531f6877859bf8122c5df74eb39442f5e749e0
parentbf394ed1a1d27d8d38d4bc386946e3442736cd75 (diff)
downloadNim-fef60716bfbae0f0eda8cf976d5cd4b61f1c5fdd.tar.gz
Fixed yield in nkBlockExpr
-rw-r--r--compiler/closureiters.nim16
-rw-r--r--tests/iter/tyieldintry.nim15
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"