From e3b5f80a890428a0c9b5c2bdd7a3205d79946957 Mon Sep 17 00:00:00 2001 From: Andreas Rumpf Date: Thu, 24 Sep 2020 22:07:23 +0200 Subject: [PATCH] more precise borrow checking of 'result' (#15406) --- compiler/sempass2.nim | 2 +- compiler/varpartitions.nim | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/compiler/sempass2.nim b/compiler/sempass2.nim index d6db0885ef..797aff7f71 100644 --- a/compiler/sempass2.nim +++ b/compiler/sempass2.nim @@ -1248,7 +1248,7 @@ proc trackProc*(c: PContext; s: PSym, body: PNode) = if not t.hasSideEffect and t.hasDangerousAssign: t.hasSideEffect = varpartitions.hasSideEffect(partitions, mutationInfo) if views in c.features: - checkBorrowedLocations(partitions, g.config) + checkBorrowedLocations(partitions, body, g.config) if sfThread in s.flags and t.gcUnsafe: if optThreads in g.config.globalOptions and optThreadAnalysis in g.config.globalOptions: diff --git a/compiler/varpartitions.nim b/compiler/varpartitions.nim index 9297c19e16..474a362cd6 100644 --- a/compiler/varpartitions.nim +++ b/compiler/varpartitions.nim @@ -110,6 +110,9 @@ proc registerVariable(c: var Partitions; n: PNode) = connectedVia: unknownLineInfo, flags: {connectsConstParam}, maxMutation: -1, minConnection: high(int), mutations: @[]) + elif n.sym.kind == skResult: + c.s.add VarIndex(kind: isEmptyRoot, sym: n.sym, + aliveStart: high(int), aliveEnd: c.abstractTime) else: c.s.add VarIndex(kind: isEmptyRoot, sym: n.sym, aliveStart: c.abstractTime, aliveEnd: c.abstractTime) @@ -567,6 +570,8 @@ proc computeLiveRanges(c: var Partitions; n: PNode) = let id = variableId(c, n.sym) if id >= 0: c.s[id].aliveEnd = max(c.s[id].aliveEnd, c.abstractTime) + if n.sym.kind == skResult: + c.s[id].aliveStart = min(c.s[id].aliveStart, c.abstractTime) of nodesToIgnoreSet: dec c.abstractTime @@ -621,7 +626,7 @@ proc computeGraphPartitions*(s: PSym; n: PNode; cursorInference = false): Partit traverse(result, n) proc dangerousMutation(g: MutationInfo; v: VarIndex): bool = - #echo "range ", v.aliveStart, " .. ", v.aliveEnd + #echo "range ", v.aliveStart, " .. ", v.aliveEnd, " ", v.sym if isMutated in g.flags: for m in g.mutations: #echo "mutation ", m @@ -643,7 +648,7 @@ proc cannotBorrow(config: ConfigRef; s: PSym; g: MutationInfo) = m.add " is the statement that connected the mutation to the parameter" localError(config, s.info, m) -proc checkBorrowedLocations*(par: var Partitions; config: ConfigRef) = +proc checkBorrowedLocations*(par: var Partitions; body: PNode; config: ConfigRef) = for i in 0 ..< par.s.len: let s = par.s[i].sym if s.kind != skParam and isViewType(s.typ):