blob: 2f971f11227007b6c039525481d4732d81cfce1b (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
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
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)
|