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>
(cherry picked from commit 008c3ec76a)
This commit is contained in:
Tanguy
2022-10-24 08:50:48 +02:00
committed by narimiran
parent c9df6cfd92
commit 8e04112762
2 changed files with 32 additions and 0 deletions

View File

@@ -1369,6 +1369,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:
@@ -1385,6 +1386,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])

View File

@@ -37,6 +37,10 @@ nested finally
outer finally
nested finally
outer finally
In defer
trying
exception caught
finally block
'''
"""
@@ -350,3 +354,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()