diff options
author | Tanguy <tanguy@status.im> | 2022-10-24 08:50:48 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-24 08:50:48 +0200 |
commit | 008c3ec76a619e9ec50ead8ee43791ea41b29b99 (patch) | |
tree | b47b5855688bb56589d111ccd90610a0b1a2114d | |
parent | 69cb671d8dac00088f3a56c0f5c9ca0de84d74be (diff) | |
download | Nim-008c3ec76a619e9ec50ead8ee43791ea41b29b99.tar.gz |
Fix double defer with break in closureiterators [backport] (#20630)
Fix double defer with break in closureiterators Signed-off-by: Tanguy <tanguy@status.im> Signed-off-by: Tanguy <tanguy@status.im>
-rw-r--r-- | compiler/closureiters.nim | 2 | ||||
-rw-r--r-- | tests/iter/titer_issues.nim | 30 |
2 files changed, 32 insertions, 0 deletions
diff --git a/compiler/closureiters.nim b/compiler/closureiters.nim index 79038a4f5..a39dd0e71 100644 --- a/compiler/closureiters.nim +++ b/compiler/closureiters.nim @@ -1372,6 +1372,7 @@ proc preprocess(c: var PreprocessContext; n: PNode): PNode = # detect: 'finally: raises X' which is currently not supported. We produce # an error for this case for now. All this will be done properly with Yuriy's # patch. + result = n case n.kind of nkTryStmt: @@ -1388,6 +1389,7 @@ proc preprocess(c: var PreprocessContext; n: PNode): PNode = discard c.finallys.pop() of nkWhileStmt, nkBlockStmt: + if n.hasYields == false: return n c.blocks.add((n, c.finallys.len)) for i in 0 ..< n.len: result[i] = preprocess(c, n[i]) diff --git a/tests/iter/titer_issues.nim b/tests/iter/titer_issues.nim index 9c7a5eab0..7dee9792d 100644 --- a/tests/iter/titer_issues.nim +++ b/tests/iter/titer_issues.nim @@ -38,6 +38,10 @@ nested finally outer finally nested finally outer finally +In defer +trying +exception caught +finally block ''' """ @@ -362,3 +366,29 @@ block: for _ in p4(): discard + +# bug #18824 +iterator poc_iterator: int {.closure.} = + block: + try: + break + finally: + echo "In defer" + +for _ in poc_iterator(): + discard + +# bug #20624 +iterator tryFinally() {.closure.} = + block route: + try: + echo "trying" + raise + except: + echo "exception caught" + break route + finally: + echo "finally block" + +var x = tryFinally +x() |