Fix exception tracking in try blocks (#10455)

Exceptions raised inside a nkFinally/nkExcept block are not caught by
the block itself.

Fixes #3886
This commit is contained in:
LemonBoy
2019-01-27 10:32:44 +01:00
committed by Andreas Rumpf
parent a0623a2356
commit 3ce6b2acb9
2 changed files with 23 additions and 1 deletions

View File

@@ -353,6 +353,8 @@ proc trackTryStmt(tracked: PEffects, n: PNode) =
var branches = 1
var hasFinally = false
# Collect the exceptions caught by the except branches
for i in 1 ..< n.len:
let b = n.sons[i]
let blen = sonsLen(b)
@@ -368,12 +370,18 @@ proc trackTryStmt(tracked: PEffects, n: PNode) =
else:
assert(b.sons[j].kind == nkType)
catches(tracked, b.sons[j].typ)
else:
assert b.kind == nkFinally
# Add any other exception raised in the except bodies
for i in 1 ..< n.len:
let b = n.sons[i]
let blen = sonsLen(b)
if b.kind == nkExceptBranch:
setLen(tracked.init, oldState)
track(tracked, b.sons[blen-1])
for i in oldState..<tracked.init.len:
addToIntersection(inter, tracked.init[i])
else:
assert b.kind == nkFinally
setLen(tracked.init, oldState)
track(tracked, b.sons[blen-1])
hasFinally = true

View File

@@ -0,0 +1,14 @@
discard """
errormsg: "can raise an unlisted exception: ref FloatingPointError"
line: 10
"""
proc foo() {.raises: [].} =
try:
discard
except KeyError:
raise newException(FloatingPointError, "foo")
except Exception:
discard
foo()