summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorYuriy Glukhov <yglukhov@users.noreply.github.com>2018-09-07 17:30:50 +0300
committerAndreas Rumpf <rumpf_a@web.de>2018-09-07 16:30:50 +0200
commit1e6eca973d9ef19176fe26d6bba394cd5a043897 (patch)
treea44c039e26cc0bb75039c1f983aa727e2256299f
parente81fe6d32f485f721fccd87e922addc5715a5fdd (diff)
downloadNim-1e6eca973d9ef19176fe26d6bba394cd5a043897.tar.gz
Fixes #8243 (#8904)
-rw-r--r--compiler/closureiters.nim19
-rw-r--r--tests/iter/tyieldintry.nim23
2 files changed, 42 insertions, 0 deletions
diff --git a/compiler/closureiters.nim b/compiler/closureiters.nim
index e3e9c2236..b0857e6c7 100644
--- a/compiler/closureiters.nim
+++ b/compiler/closureiters.nim
@@ -712,6 +712,25 @@ proc lowerStmtListExprs(ctx: var Ctx, n: PNode, needsSplit: var bool): PNode =
 
       result.add(n)
 
+  of nkBracketExpr:
+    var lhsNeedsSplit = false
+    var rhsNeedsSplit = false
+    n[0] = ctx.lowerStmtListExprs(n[0], lhsNeedsSplit)
+    n[1] = ctx.lowerStmtListExprs(n[1], rhsNeedsSplit)
+    if lhsNeedsSplit or rhsNeedsSplit:
+      needsSplit = true
+      result = newNodeI(nkStmtListExpr, n.info)
+      if lhsNeedsSplit:
+        let (st, ex) = exprToStmtList(n[0])
+        result.add(st)
+        n[0] = ex
+
+      if rhsNeedsSplit:
+        let (st, ex) = exprToStmtList(n[1])
+        result.add(st)
+        n[1] = ex
+      result.add(n)
+
   of nkWhileStmt:
     var ns = false
 
diff --git a/tests/iter/tyieldintry.nim b/tests/iter/tyieldintry.nim
index 48d05e866..6d24417a6 100644
--- a/tests/iter/tyieldintry.nim
+++ b/tests/iter/tyieldintry.nim
@@ -416,5 +416,28 @@ block: #8851
 
   test(it, 1)
 
+block: # 8243
+  iterator it(): int {.closure.} =
+    template yieldAndSeq: seq[int] =
+      yield 1
+      @[123, 5, 123]
+
+    checkpoint(yieldAndSeq[1])
+
+  test(it, 1, 5)
+
+block:
+  iterator it(): int {.closure.} =
+    template yieldAndSeq: seq[int] =
+      yield 1
+      @[123, 5, 123]
+
+    template yieldAndNum: int =
+      yield 2
+      1
+
+    checkpoint(yieldAndSeq[yieldAndNum])
+
+  test(it, 1, 2, 5)
 
 echo "ok"