summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorcooldome <cdome@bk.ru>2020-03-17 15:36:38 +0000
committerGitHub <noreply@github.com>2020-03-17 16:36:38 +0100
commit35d14095edcb530535a3f2b7e7e759c0f993e2c9 (patch)
tree506d43aedc15417800f13f519eaa0373a4d46287
parentaf9c85270198455c7ba218fae919e79060a8960a (diff)
downloadNim-35d14095edcb530535a3f2b7e7e759c0f993e2c9.tar.gz
Fixes #13659 (#13674)
* fixes #13659

Co-authored-by: cooldome <ariabushenko@bk.ru>
-rw-r--r--compiler/injectdestructors.nim4
-rw-r--r--tests/destructor/tselect.nim26
2 files changed, 27 insertions, 3 deletions
diff --git a/compiler/injectdestructors.nim b/compiler/injectdestructors.nim
index 161cb7652..48faa7e84 100644
--- a/compiler/injectdestructors.nim
+++ b/compiler/injectdestructors.nim
@@ -619,10 +619,10 @@ proc p(n: PNode; c: var Con; mode: ProcessMode): PNode =
           if n[0].kind in {nkDotExpr, nkCheckedFieldExpr}:
             cycleCheck(n, c)
           assert n[1].kind notin {nkAsgn, nkFastAsgn}
-          result = moveOrCopy(n[0], n[1], c)
+          result = moveOrCopy(p(n[0], c, mode), n[1], c)
       else:
         result = copyNode(n)
-        result.add copyTree(n[0])
+        result.add p(n[0], c, mode)
         result.add p(n[1], c, consumed)
     of nkRaiseStmt:
       if optOwnedRefs in c.graph.config.globalOptions and n[0].kind != nkEmpty:
diff --git a/tests/destructor/tselect.nim b/tests/destructor/tselect.nim
index 9262b47d4..c22bf7203 100644
--- a/tests/destructor/tselect.nim
+++ b/tests/destructor/tselect.nim
@@ -1,6 +1,9 @@
 discard """
    output: '''abcsuffix
-xyzsuffix'''
+xyzsuffix
+destroy foo 2
+destroy foo 1
+'''
   cmd: '''nim c --gc:arc $file'''
 """
 
@@ -24,3 +27,24 @@ proc test(param: string; cond: bool) =
 
 test("suffix", true)
 test("suffix", false)
+
+
+
+#--------------------------------------------------------------------
+# issue #13659
+
+type
+  Foo = ref object
+    data: int
+    parent: Foo
+
+proc `=destroy`(self: var type(Foo()[])) =
+  echo "destroy foo ", self.data
+  for i in self.fields: i.reset
+
+proc getParent(self: Foo): Foo = self.parent
+
+var foo1 = Foo(data: 1)
+var foo2 = Foo(data: 2, parent: foo1)
+
+foo2.getParent.data = 1
\ No newline at end of file