From 008c3ec76a619e9ec50ead8ee43791ea41b29b99 Mon Sep 17 00:00:00 2001 From: Tanguy Date: Mon, 24 Oct 2022 08:50:48 +0200 Subject: [PATCH] Fix double defer with break in closureiterators [backport] (#20630) Fix double defer with break in closureiterators Signed-off-by: Tanguy Signed-off-by: Tanguy --- compiler/closureiters.nim | 2 ++ tests/iter/titer_issues.nim | 30 ++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/compiler/closureiters.nim b/compiler/closureiters.nim index 79038a4f57..a39dd0e717 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 9c7a5eab07..7dee9792da 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()