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)