summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorringabout <43030857+ringabout@users.noreply.github.com>2024-06-29 16:43:41 +0800
committerGitHub <noreply@github.com>2024-06-29 10:43:41 +0200
commit56ed4e0bb95aa4e17f1bd262d12f10088b89f189 (patch)
tree921ec15365ee9bd6f540d9ac98fa15945460c8fe
parent828cd58d8a0376a5b7a6ad58d73d66617b37629a (diff)
downloadNim-56ed4e0bb95aa4e17f1bd262d12f10088b89f189.tar.gz
fixes #23759; rework move for refc (#23764)
fixes #23759
-rw-r--r--compiler/ccgexprs.nim11
-rw-r--r--compiler/cgen.nim1
-rw-r--r--tests/refc/tsinkbug.nim9
3 files changed, 18 insertions, 3 deletions
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim
index a2f97f12c..1f9fbfde9 100644
--- a/compiler/ccgexprs.nim
+++ b/compiler/ccgexprs.nim
@@ -343,7 +343,7 @@ proc genAssignment(p: BProc, dest, src: TLoc, flags: TAssignmentFlags) =
   of tyString:
     if optSeqDestructors in p.config.globalOptions:
       genGenericAsgn(p, dest, src, flags)
-    elif (needToCopy notin flags and src.storage != OnStatic) or canMove(p, src.lode, dest):
+    elif ({needToCopy, needToCopySinkParam} * flags == {} and src.storage != OnStatic) or canMove(p, src.lode, dest):
       genRefAssign(p, dest, src)
     else:
       if (dest.storage == OnStack and p.config.selectedGC != gcGo) or not usesWriteBarrier(p.config):
@@ -2345,8 +2345,13 @@ proc genMove(p: BProc; n: PNode; d: var TLoc) =
           else:
             linefmt(p, cpsStmts, "$1($2);$n", [rdLoc(b), byRefLoc(p, a)])
     else:
-      let flags = if not canMove(p, n[1], d): {needToCopy} else: {}
-      genAssignment(p, d, a, flags)
+      if n[1].kind == nkSym and isSinkParam(n[1].sym):
+        var tmp = getTemp(p, n[1].typ.skipTypes({tySink}))
+        genAssignment(p, tmp, a, {needToCopySinkParam})
+        genAssignment(p, d, tmp, {})
+        resetLoc(p, tmp)
+      else:
+        genAssignment(p, d, a, {})
       resetLoc(p, a)
 
 proc genDestroy(p: BProc; n: PNode) =
diff --git a/compiler/cgen.nim b/compiler/cgen.nim
index 437928039..f6a2a9b91 100644
--- a/compiler/cgen.nim
+++ b/compiler/cgen.nim
@@ -412,6 +412,7 @@ proc rdCharLoc(a: TLoc): Rope =
 type
   TAssignmentFlag = enum
     needToCopy
+    needToCopySinkParam
     needTempForOpenArray
   TAssignmentFlags = set[TAssignmentFlag]
 
diff --git a/tests/refc/tsinkbug.nim b/tests/refc/tsinkbug.nim
index 2cd762f40..de2ec98a5 100644
--- a/tests/refc/tsinkbug.nim
+++ b/tests/refc/tsinkbug.nim
@@ -15,3 +15,12 @@ var obj = AnObject(value: 42)
 echo "Value is: ", obj.value
 mutate(obj)
 echo "Value is: ", obj.value
+
+proc p(x: sink string) = 
+  var y = move(x)
+  doAssert x.len == 0
+  doAssert y.len == 4
+
+p("1234")
+var s = "oooo"
+p(s)