diff --git a/compiler/injectdestructors.nim b/compiler/injectdestructors.nim index 7a8c18f132..8a9b5d7b83 100644 --- a/compiler/injectdestructors.nim +++ b/compiler/injectdestructors.nim @@ -277,12 +277,13 @@ proc sinkParamIsLastReadCheck(c: var Con, s: PNode) = localError(c.graph.config, c.otherRead.info, "sink parameter `" & $s.sym.name.s & "` is already consumed at " & toFileLineCol(c. graph.config, s.info)) -type ProcessMode = enum - normal - consumed - sinkArg +type + ProcessMode = enum + normal + consumed + sinkArg -proc p(n: PNode; c: var Con; mode: ProcessMode = normal): PNode +proc p(n: PNode; c: var Con; mode: ProcessMode): PNode proc moveOrCopy(dest, ri: PNode; c: var Con): PNode proc isClosureEnv(n: PNode): bool = n.kind == nkSym and n.sym.name.s[0] == ':' @@ -295,14 +296,14 @@ proc passCopyToSink(n: PNode; c: var Con): PNode = result.add genWasMoved(tmp, c) if hasDestructor(n.typ): var m = genCopy(c, tmp, n) - m.add p(n, c) + m.add p(n, c, normal) result.add m if isLValue(n) and not isClosureEnv(n): message(c.graph.config, n.info, hintPerformance, ("passing '$1' to a sink parameter introduces an implicit copy; " & "use 'move($1)' to prevent it") % $n) else: - result.add newTree(nkAsgn, tmp, p(n, c)) + result.add newTree(nkAsgn, tmp, p(n, c, normal)) result.add tmp proc isDangerousSeq(t: PType): bool {.inline.} = @@ -330,7 +331,7 @@ template handleNested(n: untyped, processCall: untyped) = if n.len == 0: return n result = copyNode(n) for i in 0.. 0: result.add c.topLevelVars diff --git a/tests/destructor/tarc.nim b/tests/destructor/tarc.nim index 5c78605d25..25921ffd72 100644 --- a/tests/destructor/tarc.nim +++ b/tests/destructor/tarc.nim @@ -82,6 +82,16 @@ proc inheritanceBug(param: string) = s[0] = B(more: "a" & param) s[1] = B(more: "a" & param) + +type + PAsyncHttpServer = ref object + value: string + +proc serve(server: PAsyncHttpServer) = discard + +proc leakObjConstr = + serve(PAsyncHttpServer(value: "asdas")) + let startMem = getOccupiedMem() take3() tlazyList() @@ -89,4 +99,5 @@ inheritanceBug("whatever") mkManyLeaks() tsimpleClosureIterator() tleakingNewStmt() +leakObjConstr() echo getOccupiedMem() - startMem