summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2021-07-01 06:51:08 +0200
committerGitHub <noreply@github.com>2021-07-01 06:51:08 +0200
commit41c29cb3a1674a8b85844888e831b79050d91293 (patch)
tree001b33d5f4e99e0ef2f5e8f366a702ea5ceea97b
parent17911a116d8677228480d74ceb2b9593b992253e (diff)
downloadNim-41c29cb3a1674a8b85844888e831b79050d91293.tar.gz
fixes #18130 (#18407)
-rw-r--r--compiler/injectdestructors.nim2
-rw-r--r--tests/destructor/tv2_cast.nim87
2 files changed, 72 insertions, 17 deletions
diff --git a/compiler/injectdestructors.nim b/compiler/injectdestructors.nim
index 6447557c5..6e4eaa817 100644
--- a/compiler/injectdestructors.nim
+++ b/compiler/injectdestructors.nim
@@ -1057,7 +1057,7 @@ proc moveOrCopy(dest, ri: PNode; c: var Con; s: var Scope, isDecl = false): PNod
         result = c.genCopy(dest, ri)
         result.add p(ri, c, s, consumed)
         c.finishCopy(result, dest, isFromSink = false)
-    of nkHiddenSubConv, nkHiddenStdConv, nkConv, nkObjDownConv, nkObjUpConv:
+    of nkHiddenSubConv, nkHiddenStdConv, nkConv, nkObjDownConv, nkObjUpConv, nkCast:
       result = c.genSink(dest, p(ri, c, s, sinkArg), isDecl)
     of nkStmtListExpr, nkBlockExpr, nkIfExpr, nkCaseStmt, nkTryStmt:
       template process(child, s): untyped = moveOrCopy(dest, child, c, s, isDecl)
diff --git a/tests/destructor/tv2_cast.nim b/tests/destructor/tv2_cast.nim
index 5502cb38d..917cf0eb3 100644
--- a/tests/destructor/tv2_cast.nim
+++ b/tests/destructor/tv2_cast.nim
@@ -1,48 +1,81 @@
 discard """
   output: '''@[1]
 @[116, 101, 115, 116]
-@[1953719668, 875770417]'''
+@[1953719668, 875770417]
+destroying O1'''
   cmd: '''nim c --gc:arc --expandArc:main --expandArc:main1 --expandArc:main2 --expandArc:main3 --hints:off --assertions:off $file'''
   nimout: '''--expandArc: main
 
 var
   data
   :tmpD
-`=copy`(data, cast[string](encode(cast[seq[byte]](
-  :tmpD = newString(100)
-  :tmpD))))
-`=destroy`(:tmpD)
-`=destroy`(data)
+  :tmpD_1
+  :tmpD_2
+data =
+  wasMoved(:tmpD)
+  `=copy`(:tmpD, cast[string](
+    :tmpD_2 = encode(cast[seq[byte]](
+      :tmpD_1 = newString(100)
+      :tmpD_1))
+    :tmpD_2))
+  :tmpD
+`=destroy`(:tmpD_2)
+`=destroy_1`(:tmpD_1)
+`=destroy_1`(data)
 -- end of expandArc ------------------------
 --expandArc: main1
 
 var
   s
   data
+  :tmpD
+  :tmpD_1
 s = newString(100)
-`=copy`(data, cast[string](encode(toOpenArrayByte(s, 0, len(s) - 1))))
-`=destroy`(data)
-`=destroy`(s)
+data =
+  wasMoved(:tmpD)
+  `=copy`(:tmpD, cast[string](
+    :tmpD_1 = encode(toOpenArrayByte(s, 0, len(s) - 1))
+    :tmpD_1))
+  :tmpD
+`=destroy`(:tmpD_1)
+`=destroy_1`(data)
+`=destroy_1`(s)
 -- end of expandArc ------------------------
 --expandArc: main2
 
 var
   s
   data
+  :tmpD
+  :tmpD_1
 s = newSeq(100)
-`=copy`(data, cast[string](encode(s)))
-`=destroy`(data)
-`=destroy_1`(s)
+data =
+  wasMoved(:tmpD)
+  `=copy`(:tmpD, cast[string](
+    :tmpD_1 = encode(s)
+    :tmpD_1))
+  :tmpD
+`=destroy`(:tmpD_1)
+`=destroy_1`(data)
+`=destroy`(s)
 -- end of expandArc ------------------------
 --expandArc: main3
 
 var
   data
   :tmpD
-`=copy`(data, cast[string](encode do:
-  :tmpD = newSeq(100)
-  :tmpD))
-`=destroy`(:tmpD)
+  :tmpD_1
+  :tmpD_2
+data =
+  wasMoved(:tmpD)
+  `=copy`(:tmpD, cast[string](
+    :tmpD_2 = encode do:
+      :tmpD_1 = newSeq(100)
+      :tmpD_1
+    :tmpD_2))
+  :tmpD
+`=destroy`(:tmpD_2)
+`=destroy`(:tmpD_1)
 `=destroy_1`(data)
 -- end of expandArc ------------------------'''
 """
@@ -89,3 +122,25 @@ echo a
 #issue 11204
 var ac {.compileTime.} = @["a", "b"]
 const bc = ac.len
+
+
+type
+  O = object of RootRef
+    i: int
+
+  O1 = object of O
+  O2 = object of O
+
+proc `=destroy`(o: var O) =
+  echo "destroying O"
+
+proc `=destroy`(o: var O1) =
+  echo "destroying O1"
+
+proc `=destroy`(o: var O2) =
+  echo "destroying O2"
+
+proc test =
+  let o3 = cast[ref O2]((ref O1)())
+
+test()