* 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
95 lines
1.4 KiB
Nim
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)
|