mirror of
https://github.com/nim-lang/Nim.git
synced 2026-06-03 18:34:43 +00:00
fixes move for getPotentialWrites (#24753)
`move` would modify parameters as well
This commit is contained in:
@@ -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) =
|
||||
|
||||
@@ -430,7 +430,6 @@ proc rdCharLoc(a: TLoc): Rope =
|
||||
type
|
||||
TAssignmentFlag = enum
|
||||
needToCopy
|
||||
needToCopySinkParam
|
||||
needTempForOpenArray
|
||||
needAssignCall
|
||||
TAssignmentFlags = set[TAssignmentFlag]
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user