Nim/tests/arc/topt_wasmoved_destroy_pairs.nim
ringabout a137e50150
fixes #19291; implements wasMoved hook (#21303)
* fixes #19291; implements `wasMoved` hook

* basics

* checkpoint

* finish `wasMoved`

* add a test for #19291

* add documentation and changelog

* work `attachedWasMoved` with generics

* fixes optimizer

* register `=wasMoved`

* handle wasMoved magcis

* check another round

* some patches

* try `op == nil`

* nicer

* generate `wasMoved` before `destroy`

* try again

* fixes tests

* default wasMoved

* Update tests/destructor/tv2_cast.nim

* Update tests/destructor/tv2_cast.nim

* Update tests/arc/topt_refcursors.nim
2023-03-02 05:29:40 +01:00

95 lines
1.4 KiB
Nim

discard """
output: ''''''
cmd: '''nim c --gc:arc --expandArc:main --expandArc:tfor --hint:Performance:off $file'''
nimout: '''
--expandArc: main
var
a
b
x
x = f()
if cond:
add(a):
let blitTmp = x
blitTmp
else:
add(b):
let blitTmp_1 = x
blitTmp_1
`=destroy`(b)
`=destroy`(a)
-- end of expandArc ------------------------
--expandArc: tfor
var
a
b
x
try:
x = f()
block :tmp:
var i_cursor
mixin inc
var i_1 = 0
block :tmp_1:
while i_1 < 4:
var :tmpD
i_cursor = i_1
if i_cursor == 2:
return
add(a):
`=wasMoved`(:tmpD)
`=copy`(:tmpD, x)
:tmpD
inc i_1, 1
if cond:
add(a):
let blitTmp = x
`=wasMoved`(x)
blitTmp
else:
add(b):
let blitTmp_1 = x
`=wasMoved`(x)
blitTmp_1
finally:
`=destroy`(x)
`=destroy_1`(b)
`=destroy_1`(a)
-- end of expandArc ------------------------
'''
"""
proc f(): seq[int] =
@[1, 2, 3]
proc main(cond: bool) =
var a, b: seq[seq[int]]
var x = f()
if cond:
a.add x
else:
b.add x
# all paths move 'x' so no wasMoved(x); destroy(x) pair should be left in the
# AST.
main(false)
proc tfor(cond: bool) =
var a, b: seq[seq[int]]
var x = f()
for i in 0 ..< 4:
if i == 2: return
a.add x
if cond:
a.add x
else:
b.add x
tfor(false)