Skip to content

Commit

Permalink
closes #12758
Browse files Browse the repository at this point in the history
  • Loading branch information
Araq committed Dec 1, 2019
1 parent 552a1dc commit 451b59e
Showing 1 changed file with 47 additions and 0 deletions.
47 changes: 47 additions & 0 deletions tests/destructor/tgcleak4.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
discard """
outputsub: "no leak: "
cmd: "nim c --gc:arc $file"
"""
# bug #12758
type
TExpr {.inheritable.} = object ## abstract base class for an expression
PLiteral = ref TLiteral
TLiteral = object of TExpr
x: int
op1: string
TPlusExpr = object of TExpr
a, b: ref TExpr
op2: string

method eval(e: ref TExpr): int {.base.} =
# override this base method
quit "to override!"

method eval(e: ref TLiteral): int = return e.x

method eval(e: ref TPlusExpr): int =
# watch out: relies on dynamic binding
return eval(e.a) + eval(e.b)

proc newLit(x: int): ref TLiteral =
new(result)
result.x = x
result.op1 = $getOccupiedMem()

proc newPlus(a, b: ref TExpr): ref TPlusExpr =
new(result)
result.a = a
result.b = b
result.op2 = $getOccupiedMem()

const Limit = when compileOption("gc", "markAndSweep") or compileOption("gc", "boehm"): 5*1024*1024 else: 500_000

for i in 0..100_000:
var s: array[0..11, ref TExpr]
for j in 0..high(s):
s[j] = newPlus(newPlus(newLit(j), newLit(2)), newLit(4))
if eval(s[j]) != j+6:
quit "error: wrong result"
if getOccupiedMem() > Limit: quit("still a leak!")

echo "no leak: ", getOccupiedMem()

0 comments on commit 451b59e

Please sign in to comment.