fixes result requires explicit initialization on noReturn code (#22717)

fixes #21615; fixes #16735

It also partially fixes | #22673, though It still gives 'baseless'
warnings.
This commit is contained in:
ringabout
2023-09-18 14:28:40 +08:00
committed by GitHub
parent bd857151d8
commit deefbc420e
2 changed files with 28 additions and 1 deletions

View File

@@ -1556,7 +1556,7 @@ proc trackProc*(c: PContext; s: PSym, body: PNode) =
strictDefs in c.features) and
s.kind in {skProc, skFunc, skConverter, skMethod} and s.magic == mNone:
var res = s.ast[resultPos].sym # get result symbol
if res.id notin t.init:
if res.id notin t.init and breaksBlock(body) != bsNoReturn:
if tfRequiresInit in s.typ[0].flags:
localError(g.config, body.info, "'$1' requires explicit initialization" % "result")
else:

View File

@@ -62,3 +62,30 @@ block:
raise newException(ValueError, "unreachable")
discard test(true)
# bug #21615
# bug #16735
block:
type Test {.requiresInit.} = object
id: int
proc bar(): int =
raise newException(CatchableError, "error")
proc test(): Test =
raise newException(CatchableError, "")
template catchError(body) =
var done = false
try:
body
except CatchableError:
done = true
doAssert done
catchError:
echo test()
catchError:
echo bar()