summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2020-03-19 12:57:45 +0100
committerGitHub <noreply@github.com>2020-03-19 12:57:45 +0100
commit034dad8e321edcf6cf88a2ad93fceafae267cc74 (patch)
tree5b2a4550d6e2ec0182fc9b8003e25bc75579e9c1
parent1f2042411a5343ad8bbdc8d2b1a75ce4f866a04c (diff)
downloadNim-034dad8e321edcf6cf88a2ad93fceafae267cc74.tar.gz
fixes #13691 (#13694)
-rw-r--r--compiler/injectdestructors.nim7
-rw-r--r--tests/arc/tarcmisc.nim29
2 files changed, 34 insertions, 2 deletions
diff --git a/compiler/injectdestructors.nim b/compiler/injectdestructors.nim
index 55886540c..dec437427 100644
--- a/compiler/injectdestructors.nim
+++ b/compiler/injectdestructors.nim
@@ -602,7 +602,10 @@ proc pVarTopLevel(v: PNode; c: var Con; ri, res: PNode) =
       res.add newTree(nkFastAsgn, v, genDefaultCall(v.typ, c, v.info))
   elif sfThread notin v.sym.flags:
     # do not destroy thread vars for now at all for consistency.
-    c.destroys.add genDestroy(c, v)
+    if sfGlobal in v.sym.flags:
+      c.graph.globalDestructors.add genDestroy(c, v)
+    else:
+      c.destroys.add genDestroy(c, v)
   if ri.kind == nkEmpty and c.inLoop > 0:
     res.add moveOrCopy(v, genDefaultCall(v.typ, c, v.info), c)
   elif ri.kind != nkEmpty:
@@ -616,7 +619,7 @@ proc pVarScoped(v: PNode; c: var Con; ri, res: PNode) =
       # unpacked tuple needs reset at every loop iteration
       res.add newTree(nkFastAsgn, v, genDefaultCall(v.typ, c, v.info))
   elif {sfGlobal, sfThread} * v.sym.flags == {sfGlobal}:
-    c.destroys.add genDestroy(c, v)
+     c.graph.globalDestructors.add genDestroy(c, v)
   else:
     # We always translate 'var v = f()' into bitcopies. If 'v' is in a loop,
     # the destruction at the loop end will free the resources. Other assignments
diff --git a/tests/arc/tarcmisc.nim b/tests/arc/tarcmisc.nim
new file mode 100644
index 000000000..9662ecf7f
--- /dev/null
+++ b/tests/arc/tarcmisc.nim
@@ -0,0 +1,29 @@
+discard """
+  output: '''
+destroyed: false
+destroyed: false
+destroying variable'''
+  cmd: "nim c --gc:arc $file"
+"""
+
+# bug #13691
+type Variable = ref object
+  value: int
+
+proc `=destroy`(self: var typeof(Variable()[])) =
+  echo "destroying variable"
+
+proc newVariable(value: int): Variable =
+  result = Variable()
+  result.value = value
+
+proc test(count: int) =
+  var v {.global.} = newVariable(10)
+
+  var count = count - 1
+  if count == 0: return
+
+  test(count)
+  echo "destroyed: ", v.isNil
+
+test(3)