fixes move for getPotentialWrites (#24753)

`move` would modify parameters as well
This commit is contained in:
ringabout
2025-03-11 16:57:48 +08:00
committed by GitHub
parent ccb40024c6
commit e2d4791229
4 changed files with 12 additions and 10 deletions

View File

@@ -357,7 +357,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, needToCopySinkParam} * flags == {} and src.storage != OnStatic) or canMove(p, src.lode, dest):
elif (needToCopy notin 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):
@@ -2757,13 +2757,7 @@ proc genMove(p: BProc; n: PNode; d: var TLoc) =
let val = if p.module.compileToCpp: rdLoc(a) else: byRefLoc(p, a)
p.s(cpsStmts).addCallStmt(rdLoc(b), val)
else:
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, {})
genAssignment(p, d, a, {})
resetLoc(p, a)
proc genDestroy(p: BProc; n: PNode) =

View File

@@ -430,7 +430,6 @@ proc rdCharLoc(a: TLoc): Rope =
type
TAssignmentFlag = enum
needToCopy
needToCopySinkParam
needTempForOpenArray
needAssignCall
TAssignmentFlags = set[TAssignmentFlag]

View File

@@ -263,7 +263,7 @@ proc getPotentialWrites*(n: PNode; mutate: bool; result: var seq[PNode]) =
getPotentialWrites(n[1], true, result)
for i in 2..<n.len:
getPotentialWrites(n[i], mutate, result)
of mSwap:
of mSwap, mMove:
for i in 1..<n.len:
getPotentialWrites(n[i], true, result)
else:

View File

@@ -69,3 +69,12 @@ test
static:
test
block:
proc say(a: int, b: int) =
doAssert a == 1
doAssert b == 0
var a = 1
var b = a
say a, (b = move a; a)