summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2022-03-09 11:42:09 +0100
committerGitHub <noreply@github.com>2022-03-09 11:42:09 +0100
commit2beefb9aa02171abce0512429336d86830025f3d (patch)
treebf9cd968508bed42c86aae31641f980e60c6e885
parent0d6795a771e46b07244f3a3f43502602acbebdc3 (diff)
downloadNim-2beefb9aa02171abce0512429336d86830025f3d.tar.gz
fixes #19575 (#19596) [backport]
* fixes #19575

* better bugfix
-rw-r--r--compiler/closureiters.nim6
-rw-r--r--tests/iter/titer_issues.nim23
2 files changed, 27 insertions, 2 deletions
diff --git a/compiler/closureiters.nim b/compiler/closureiters.nim
index a8da7485e..4d9aeb3f7 100644
--- a/compiler/closureiters.nim
+++ b/compiler/closureiters.nim
@@ -1351,13 +1351,15 @@ proc preprocess(c: var PreprocessContext; n: PNode): PNode =
   case n.kind
   of nkTryStmt:
     let f = n.lastSon
+    var didAddSomething = false
     if f.kind == nkFinally:
       c.finallys.add f.lastSon
+      didAddSomething = true
 
     for i in 0 ..< n.len:
       result[i] = preprocess(c, n[i])
 
-    if f.kind == nkFinally:
+    if didAddSomething:
       discard c.finallys.pop()
 
   of nkWhileStmt, nkBlockStmt:
@@ -1384,7 +1386,7 @@ proc preprocess(c: var PreprocessContext; n: PNode): PNode =
         result = newNodeI(nkStmtList, n.info)
         for i in countdown(c.finallys.high, fin):
           var vars = FreshVarsContext(tab: initTable[int, PSym](), config: c.config, info: n.info, idgen: c.idgen)
-          result.add freshVars(preprocess(c, c.finallys[i]), vars)
+          result.add freshVars(copyTree(c.finallys[i]), vars)
           c.idgen = vars.idgen
         result.add n
   of nkSkip: discard
diff --git a/tests/iter/titer_issues.nim b/tests/iter/titer_issues.nim
index 65f66ad26..15fe867c8 100644
--- a/tests/iter/titer_issues.nim
+++ b/tests/iter/titer_issues.nim
@@ -251,3 +251,26 @@ block:
 
   for x in ff(@[1, 2], @[1, 2, 3]):
     echo x
+
+
+# bug #19575
+
+iterator bb() {.closure.} =
+    while true:
+        try: discard
+        except: break
+        finally: break
+
+var a = bb
+
+iterator cc() {.closure.} =
+    while true:
+        try: discard
+        except:
+          if true:
+            break
+        finally:
+          if true:
+            break
+
+var a2 = cc