Skip to content

Commit

Permalink
ARC: yet another silly bugfix
Browse files Browse the repository at this point in the history
  • Loading branch information
Araq committed Nov 22, 2019
1 parent f0c5d99 commit c85e266
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 0 deletions.
2 changes: 2 additions & 0 deletions compiler/sempass2.nim
Original file line number Diff line number Diff line change
Expand Up @@ -692,6 +692,8 @@ proc track(tracked: PEffects, n: PNode) =
case n.kind
of nkSym:
useVar(tracked, n)
if n.sym.typ != nil and tfHasAsgn in n.sym.typ.flags:
tracked.owner.flags.incl sfInjectDestructors
of nkRaiseStmt:
if n[0].kind != nkEmpty:
n.sons[0].info = n.info
Expand Down
29 changes: 29 additions & 0 deletions tests/destructor/tarc2.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
discard """
output: '''leak: true'''
cmd: '''nim c --gc:arc $file'''
"""

type
T = ref object
s: seq[T]
data: string

proc create(): T = T(s: @[], data: "abc")

proc addX(x: T; data: string) =
x.data = data

proc addX(x: T; child: T) =
x.s.add child

proc main(rootName: string) =
var root = create()
root.data = rootName
# this implies we do the refcounting wrong. We should leak memory here
# and not create a destruction cycle:
root.addX root

let mem = getOccupiedMem()
main("yeah")
# since we created a retain cycle, we MUST leak memory here:
echo "leak: ", getOccupiedMem() - mem > 0

0 comments on commit c85e266

Please sign in to comment.