summary refs log tree commit diff stats
path: root/tests/arc/topt_wasmoved_destroy_pairs.nim
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)