diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2022-03-09 11:42:09 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-03-09 11:42:09 +0100 |
commit | 2beefb9aa02171abce0512429336d86830025f3d (patch) | |
tree | bf9cd968508bed42c86aae31641f980e60c6e885 | |
parent | 0d6795a771e46b07244f3a3f43502602acbebdc3 (diff) | |
download | Nim-2beefb9aa02171abce0512429336d86830025f3d.tar.gz |
fixes #19575 (#19596) [backport]
* fixes #19575 * better bugfix
-rw-r--r-- | compiler/closureiters.nim | 6 | ||||
-rw-r--r-- | tests/iter/titer_issues.nim | 23 |
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 |