parent
0d6795a771
commit
2beefb9aa0
2 changed files with 27 additions and 2 deletions
|
|
@ -1351,13 +1351,15 @@ proc preprocess(c: var PreprocessContext; n: PNode): PNode =
|
||||||
case n.kind
|
case n.kind
|
||||||
of nkTryStmt:
|
of nkTryStmt:
|
||||||
let f = n.lastSon
|
let f = n.lastSon
|
||||||
|
var didAddSomething = false
|
||||||
if f.kind == nkFinally:
|
if f.kind == nkFinally:
|
||||||
c.finallys.add f.lastSon
|
c.finallys.add f.lastSon
|
||||||
|
didAddSomething = true
|
||||||
|
|
||||||
for i in 0 ..< n.len:
|
for i in 0 ..< n.len:
|
||||||
result[i] = preprocess(c, n[i])
|
result[i] = preprocess(c, n[i])
|
||||||
|
|
||||||
if f.kind == nkFinally:
|
if didAddSomething:
|
||||||
discard c.finallys.pop()
|
discard c.finallys.pop()
|
||||||
|
|
||||||
of nkWhileStmt, nkBlockStmt:
|
of nkWhileStmt, nkBlockStmt:
|
||||||
|
|
@ -1384,7 +1386,7 @@ proc preprocess(c: var PreprocessContext; n: PNode): PNode =
|
||||||
result = newNodeI(nkStmtList, n.info)
|
result = newNodeI(nkStmtList, n.info)
|
||||||
for i in countdown(c.finallys.high, fin):
|
for i in countdown(c.finallys.high, fin):
|
||||||
var vars = FreshVarsContext(tab: initTable[int, PSym](), config: c.config, info: n.info, idgen: c.idgen)
|
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
|
c.idgen = vars.idgen
|
||||||
result.add n
|
result.add n
|
||||||
of nkSkip: discard
|
of nkSkip: discard
|
||||||
|
|
|
||||||
|
|
@ -251,3 +251,26 @@ block:
|
||||||
|
|
||||||
for x in ff(@[1, 2], @[1, 2, 3]):
|
for x in ff(@[1, 2], @[1, 2, 3]):
|
||||||
echo x
|
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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue