Skip to content

Commit

Permalink
fixes move sideeffects issues [backport] (#22439)
Browse files Browse the repository at this point in the history
* fixes move sideeffects issues [backport]

* fix openarray

* fixes openarray
  • Loading branch information
ringabout committed Aug 10, 2023
1 parent 7be2e2b commit faf1c91
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 3 deletions.
18 changes: 15 additions & 3 deletions compiler/ccgexprs.nim
Original file line number Diff line number Diff line change
Expand Up @@ -2310,9 +2310,21 @@ proc genMove(p: BProc; n: PNode; d: var TLoc) =
if op == nil:
resetLoc(p, a)
else:
let addrExp = makeAddr(n[1], p.module.idgen)
let wasMovedCall = newTreeI(nkCall, n.info, newSymNode(op), addrExp)
genCall(p, wasMovedCall, d)
var b = initLocExpr(p, newSymNode(op))
case skipTypes(a.t, abstractVar+{tyStatic}).kind
of tyOpenArray, tyVarargs: # todo fixme generated `wasMoved` hooks for
# openarrays, but it probably shouldn't?
var s: string
if reifiedOpenArray(a.lode):
if a.t.kind in {tyVar, tyLent}:
s = "$1->Field0, $1->Field1" % [rdLoc(a)]
else:
s = "$1.Field0, $1.Field1" % [rdLoc(a)]
else:
s = "$1, $1Len_0" % [rdLoc(a)]
linefmt(p, cpsStmts, "$1($2);$n", [rdLoc(b), s])
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)
Expand Down
18 changes: 18 additions & 0 deletions tests/destructor/tmove.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
discard """
targets: "c cpp"
"""

block:
var called = 0

proc bar(a: var int): var int =
inc called
result = a

proc foo =
var a = 2
var s = move bar(a)
doAssert called == 1
doAssert s == 2

foo()

0 comments on commit faf1c91

Please sign in to comment.