summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/injectdestructors.nim1
-rw-r--r--tests/arc/tmovebug.nim14
-rw-r--r--tests/destructor/tnewruntime_strutils.nim13
3 files changed, 27 insertions, 1 deletions
diff --git a/compiler/injectdestructors.nim b/compiler/injectdestructors.nim
index b65391252..152efd8a1 100644
--- a/compiler/injectdestructors.nim
+++ b/compiler/injectdestructors.nim
@@ -573,6 +573,7 @@ template processScopeExpr(c: var Con; s: var Scope; ret: PNode, processCall: unt
   let tmp = c.getTemp(s.parent[], ret.typ, ret.info)
   tmp.sym.flags.incl sfSingleUsedTemp
   let cpy = if hasDestructor(c, ret.typ):
+              s.parent[].final.add c.genDestroy(tmp)
               moveOrCopy(tmp, ret, c, s, isDecl = true)
             else:
               newTree(nkFastAsgn, tmp, p(ret, c, s, normal))
diff --git a/tests/arc/tmovebug.nim b/tests/arc/tmovebug.nim
index 888027186..3ff1c4a0c 100644
--- a/tests/arc/tmovebug.nim
+++ b/tests/arc/tmovebug.nim
@@ -107,6 +107,8 @@ sink
 destroy
 copy
 destroy
+(f: 1)
+destroy
 '''
 """
 
@@ -770,3 +772,15 @@ proc pair(): tuple[a: C, b: C] =
 
 discard pair()
 
+
+# bug #17450
+proc noConsume(x: OO) {.nosinks.} = echo x
+
+proc main3 =
+  var i = 1
+  noConsume:
+    block:
+      OO(f: i)
+
+main3()
+
diff --git a/tests/destructor/tnewruntime_strutils.nim b/tests/destructor/tnewruntime_strutils.nim
index 8e5378f77..9c8d41973 100644
--- a/tests/destructor/tnewruntime_strutils.nim
+++ b/tests/destructor/tnewruntime_strutils.nim
@@ -5,7 +5,8 @@ discard """
 @[(input: @["KXSC", "BGMC"]), (input: @["PXFX"]), (input: @["WXRQ", "ZSCZD"])]
 14
 First tasks completed.
-Second tasks completed.'''
+Second tasks completed.
+test1'''
 """
 
 import strutils, os, std / wordwrap
@@ -241,3 +242,13 @@ when true:
   test_string_b.setLen new_len_b
 
   echo "Second tasks completed."
+
+# bug #17450
+proc main =
+  var i = 1
+  echo:
+    block:
+      "test" & $i
+
+main()
+