From 6f00b46c4babecd7ca995dd50188b5e8a5bb0dc2 Mon Sep 17 00:00:00 2001 From: ringabout <43030857+ringabout@users.noreply.github.com> Date: Fri, 11 Aug 2023 00:04:29 +0800 Subject: [PATCH] fixes move sideeffects issues [backport] (#22439) * fixes move sideeffects issues [backport] * fix openarray * fixes openarray (cherry picked from commit faf1c91e6a418e21d56ac6e45e1dbc851f9ffd22) --- compiler/ccgexprs.nim | 19 ++++++++++++++++--- tests/destructor/tmove.nim | 18 ++++++++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 tests/destructor/tmove.nim diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index 837a2f862f..71a0747409 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -2368,9 +2368,22 @@ 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: TLoc + initLocExpr(p, newSymNode(op), b) + 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) diff --git a/tests/destructor/tmove.nim b/tests/destructor/tmove.nim new file mode 100644 index 0000000000..2762aff900 --- /dev/null +++ b/tests/destructor/tmove.nim @@ -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()