summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/injectdestructors.nim2
-rw-r--r--compiler/liftdestructors.nim2
-rw-r--r--compiler/sempass2.nim10
-rw-r--r--tests/destructor/tarc.nim12
-rw-r--r--tests/js/tcopying.nim4
5 files changed, 25 insertions, 5 deletions
diff --git a/compiler/injectdestructors.nim b/compiler/injectdestructors.nim
index 84473aabc..f5e525e00 100644
--- a/compiler/injectdestructors.nim
+++ b/compiler/injectdestructors.nim
@@ -352,6 +352,8 @@ proc passCopyToSink(n: PNode; c: var Con): PNode =
         ("passing '$1' to a sink parameter introduces an implicit copy; " &
         "use 'move($1)' to prevent it") % $n)
   else:
+    if c.graph.config.selectedGC in {gcArc, gcOrc}:
+      assert(not containsGarbageCollectedRef(n.typ))
     result.add newTree(nkAsgn, tmp, p(n, c, normal))
   result.add tmp
 
diff --git a/compiler/liftdestructors.nim b/compiler/liftdestructors.nim
index daf91954b..b9b121070 100644
--- a/compiler/liftdestructors.nim
+++ b/compiler/liftdestructors.nim
@@ -656,7 +656,7 @@ proc fillBody(c: var TLiftCtx; t: PType; body, x, y: PNode) =
   of tyTuple:
     fillBodyTup(c, t, body, x, y)
   of tyVarargs, tyOpenArray:
-    if c.kind == attachedDestructor:
+    if c.kind == attachedDestructor and (tfHasAsgn in t.flags or useNoGc(c, t)):
       forallElements(c, t, body, x, y)
     else:
       discard "cannot copy openArray"
diff --git a/compiler/sempass2.nim b/compiler/sempass2.nim
index 1b9c388b3..042cd9a6e 100644
--- a/compiler/sempass2.nim
+++ b/compiler/sempass2.nim
@@ -907,9 +907,15 @@ proc track(tracked: PEffects, n: PNode) =
       nkMacroDef, nkTemplateDef, nkLambda, nkDo, nkFuncDef:
     discard
   of nkCast, nkHiddenStdConv, nkHiddenSubConv, nkConv:
-    if n.len == 2: track(tracked, n[1])
+    if n.len == 2:
+      track(tracked, n[1])
+      if tracked.owner.kind != skMacro:
+        createTypeBoundOps(tracked, n.typ, n.info)
   of nkObjUpConv, nkObjDownConv, nkChckRange, nkChckRangeF, nkChckRange64:
-    if n.len == 1: track(tracked, n[0])
+    if n.len == 1:
+      track(tracked, n[0])
+      if tracked.owner.kind != skMacro:
+        createTypeBoundOps(tracked, n.typ, n.info)
   of nkBracket:
     for i in 0..<n.safeLen: track(tracked, n[i])
     if tracked.owner.kind != skMacro:
diff --git a/tests/destructor/tarc.nim b/tests/destructor/tarc.nim
index d5e181630..58642d09f 100644
--- a/tests/destructor/tarc.nim
+++ b/tests/destructor/tarc.nim
@@ -3,6 +3,7 @@ discard """
 @[1, 2, 3]
 Success
 @["a", "b", "c"]
+Hello
 0'''
   cmd: '''nim c --gc:arc $file'''
 """
@@ -114,4 +115,15 @@ proc bug12964*() =
 
 bug12964()
 
+# bug #13119
+import streams
+
+proc bug13119 =
+  var m = newStringStream("Hello world")
+  let buffer = m.readStr(5)
+  echo buffer
+  m.close
+
+bug13119()
+
 echo getOccupiedMem() - startMem
diff --git a/tests/js/tcopying.nim b/tests/js/tcopying.nim
index c58a080e9..1f668be52 100644
--- a/tests/js/tcopying.nim
+++ b/tests/js/tcopying.nim
@@ -14,7 +14,7 @@ type MyArray = array[1, int]
 proc changeArray(a: var MyArray) =
     a = [123]
 
-var a : MyArray
+var a: MyArray
 changeArray(a)
 echo a[0]
 
@@ -34,7 +34,7 @@ block:
         ary2: array[3, int]
 
     let ary1 = [1, 2, 3]
-    var obj = TestObj(ary2:ary1)
+    var obj = TestObj(ary2: ary1)
 
     obj.ary2[1] = 9