From a5d0950eb0ba84d2e3e4686da9d1a6bbfa447268 Mon Sep 17 00:00:00 2001 From: Araq Date: Sat, 2 May 2020 13:37:57 +0200 Subject: [PATCH] fixes #14159 [backport:1.2] (cherry picked from commit 87ac28d19ac9740d871ac85a8c79178344c6b7b3) --- compiler/dfa.nim | 4 +++- tests/destructor/tcycle3.nim | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/compiler/dfa.nim b/compiler/dfa.nim index e4cadde5b2..0cefec2858 100644 --- a/compiler/dfa.nim +++ b/compiler/dfa.nim @@ -639,8 +639,10 @@ proc isAnalysableFieldAccess*(orig: PNode; owner: PSym): bool = of nkHiddenDeref, nkDerefExpr: # We "own" sinkparam[].loc but not ourVar[].location as it is a nasty # pointer indirection. + # bug #14159, we cannot reason about sinkParam[].location as it can + # still be shared for tyRef. n = n[0] - return n.kind == nkSym and n.sym.owner == owner and (isSinkParam(n.sym) or + return n.kind == nkSym and n.sym.owner == owner and ( n.sym.typ.skipTypes(abstractInst-{tyOwned}).kind in {tyOwned}) else: break diff --git a/tests/destructor/tcycle3.nim b/tests/destructor/tcycle3.nim index a938ded01a..8662136e70 100644 --- a/tests/destructor/tcycle3.nim +++ b/tests/destructor/tcycle3.nim @@ -2,6 +2,8 @@ discard """ output: '''BEGIN END END 2 +cpu.nes false +cpu step nes is nil? - false 0''' cmd: '''nim c --gc:orc $file''' """ @@ -59,6 +61,38 @@ proc main = c.run echo "END 2" +# bug #14159 +type + NES = ref object + cpu: CPU + apu: APU + + CPU = ref object + nes: NES + + APU = object + nes: NES + cpu: CPU + +proc initAPU(nes: sink NES): APU {.nosinks.} = + result.nes = nes + result.cpu = nes.cpu + +proc step(cpu: CPU): int = + echo "cpu.nes ", cpu.isNil + echo "cpu step nes is nil? - ", cpu.nes.isNil() + +proc newNES(): NES = + new result + result.cpu = CPU(nes: result) + result.apu = initAPU(result) + +proc bug14159 = + var nesConsole = newNES() + discard nesConsole.cpu.step() + let mem = getOccupiedMem() main() +bug14159() +GC_fullCollect() echo getOccupiedMem() - mem