Perform nil checks during object construction and within compiles()

Close https://github.com/nim-lang/Nim/issues/6494
This commit is contained in:
Zahary Karadjov 2020-03-29 20:31:37 +03:00 • committed by Andreas Rumpf
commit 4f3d309fb0
4 changed files with 10 additions and 7 deletions

View file

@ -996,6 +996,7 @@ proc track(tracked: PEffects, n: PNode) =
createTypeBoundOps(tracked, x[1].typ, n.info)
if x.kind == nkExprColonExpr:
notNilCheck(tracked, x[1], x[0].sym.typ)
checkForSink(tracked.config, tracked.owner, x[1])
else:
checkForSink(tracked.config, tracked.owner, x)
@ -1260,7 +1261,7 @@ proc trackProc*(c: PContext; s: PSym, body: PNode) =
dataflowAnalysis(s, body)
when false: trackWrites(s, body)
proc trackTopLevelStmt*(c: PContext; module: PSym; n: PNode) =
proc trackStmt*(c: PContext; module: PSym; n: PNode, isTopLevel: bool) =
if n.kind in {nkPragma, nkMacroDef, nkTemplateDef, nkProcDef, nkFuncDef,
nkTypeSection, nkConverterDef, nkMethodDef, nkIteratorDef}:
return
@ -1268,5 +1269,5 @@ proc trackTopLevelStmt*(c: PContext; module: PSym; n: PNode) =
var effects = newNode(nkEffectList, n.info)
var t: TEffects
initEffects(g, effects, module, t, c)
t.isTopLevel = true
t.isTopLevel = isTopLevel
track(t, n)