summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/ccgexprs.nim15
-rw-r--r--tests/gc/t22173.nim20
2 files changed, 6 insertions, 29 deletions
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim
index 8874f54ae..712b874d9 100644
--- a/compiler/ccgexprs.nim
+++ b/compiler/ccgexprs.nim
@@ -342,15 +342,12 @@ proc genAssignment(p: BProc, dest, src: TLoc, flags: TAssignmentFlags) =
       if (dest.storage == OnStack and p.config.selectedGC != gcGo) or not usesWriteBarrier(p.config):
         linefmt(p, cpsStmts, "$1 = #copyString($2);$n", [dest.rdLoc, src.rdLoc])
       elif dest.storage == OnHeap:
-        if dest.lode.typ.kind == tySink:
-          genRefAssign(p, dest, src)
-        else:
-          # we use a temporary to care for the dreaded self assignment:
-          var tmp: TLoc
-          getTemp(p, ty, tmp)
-          linefmt(p, cpsStmts, "$3 = $1; $1 = #copyStringRC1($2);$n",
-                  [dest.rdLoc, src.rdLoc, tmp.rdLoc])
-          linefmt(p, cpsStmts, "if ($1) #nimGCunrefNoCycle($1);$n", [tmp.rdLoc])
+        # we use a temporary to care for the dreaded self assignment:
+        var tmp: TLoc
+        getTemp(p, ty, tmp)
+        linefmt(p, cpsStmts, "$3 = $1; $1 = #copyStringRC1($2);$n",
+                [dest.rdLoc, src.rdLoc, tmp.rdLoc])
+        linefmt(p, cpsStmts, "if ($1) #nimGCunrefNoCycle($1);$n", [tmp.rdLoc])
       else:
         linefmt(p, cpsStmts, "#unsureAsgnRef((void**) $1, #copyString($2));$n",
                [addrLoc(p.config, dest), rdLoc(src)])
diff --git a/tests/gc/t22173.nim b/tests/gc/t22173.nim
deleted file mode 100644
index 3fa3cc503..000000000
--- a/tests/gc/t22173.nim
+++ /dev/null
@@ -1,20 +0,0 @@
-discard """
-  cmd: '''nim c --gc:refc -r $file'''
-"""
-const Memo = 100 * 1024
-
-proc fff(v: sink string): iterator(): char =
-  return iterator(): char =
-    for c in v:
-      yield c
-
-var tmp = newString(Memo)
-
-let iter = fff(move(tmp))
-
-while true:
-  let v = iter()
-  if finished(iter):
-    break
-
-doAssert getOccupiedMem() < Memo * 3