Fix handling of reraise in effect tracking (#10582)

This is the MVP in order not to get a completely useless error message
from the compiler.

Fixes #10579
This commit is contained in:
LemonBoy
2019-02-07 17:07:03 +01:00
committed by Miran
parent c95616f6ee
commit f23b0a7dc8
2 changed files with 23 additions and 5 deletions

View File

@@ -721,11 +721,17 @@ proc track(tracked: PEffects, n: PNode) =
of nkSym:
useVar(tracked, n)
of nkRaiseStmt:
n.sons[0].info = n.info
#throws(tracked.exc, n.sons[0])
addEffect(tracked, n.sons[0], useLineInfo=false)
for i in 0 ..< safeLen(n):
track(tracked, n.sons[i])
if n[0].kind != nkEmpty:
n.sons[0].info = n.info
#throws(tracked.exc, n.sons[0])
addEffect(tracked, n.sons[0], useLineInfo=false)
for i in 0 ..< safeLen(n):
track(tracked, n.sons[i])
else:
# A `raise` with no arguments means we're going to re-raise the exception
# being handled or, if outside of an `except` block, a `ReraiseError`.
# Here we add a `Exception` tag in order to cover both the cases.
addEffect(tracked, createRaise(tracked.graph, n))
of nkCallKinds:
if getConstExpr(tracked.owner_module, n, tracked.graph) != nil:
return

View File

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