== test == fun test(b: Boolean): (Int) -> Int { if (b) { fun foo(n: Int) = n + 1 } else { fun bar(n: Int) = n - 1 } } --------------------- L0: 1 v(b: Boolean) magic[FAKE_INITIALIZER](b: Boolean) -> w(b|) 2 mark({ if (b) { fun foo(n: Int) = n + 1 } else { fun bar(n: Int) = n - 1 } }) mark(if (b) { fun foo(n: Int) = n + 1 } else { fun bar(n: Int) = n - 1 }) r(b) -> jf(L2|) NEXT:[mark({ fun bar(n: Int) = n - 1 }), mark({ fun foo(n: Int) = n + 1 })] 3 mark({ fun foo(n: Int) = n + 1 }) jmp?(L3) NEXT:[jmp(L6), d(fun foo(n: Int) = n + 1)] d(fun foo(n: Int) = n + 1) NEXT:[] L3 [after local declaration]: 2 jmp(L6) NEXT:[merge(if (b) { fun foo(n: Int) = n + 1 } else { fun bar(n: Int) = n - 1 }|!, !) -> ] PREV:[jmp?(L3)] L2 [else branch]: 3 mark({ fun bar(n: Int) = n - 1 }) PREV:[jf(L2|)] jmp?(L7) NEXT:[merge(if (b) { fun foo(n: Int) = n + 1 } else { fun bar(n: Int) = n - 1 }|!, !) -> , d(fun bar(n: Int) = n - 1)] d(fun bar(n: Int) = n - 1) NEXT:[] L6 ['if' expression result]: L7 [after local declaration]: 2 merge(if (b) { fun foo(n: Int) = n + 1 } else { fun bar(n: Int) = n - 1 }|!, !) -> PREV:[jmp(L6), jmp?(L7)] L1: 1 NEXT:[] error: PREV:[] sink: PREV:[, , d(fun foo(n: Int) = n + 1), d(fun bar(n: Int) = n - 1)] ===================== == foo == fun foo(n: Int) = n + 1 --------------------- L4: 4 v(n: Int) magic[FAKE_INITIALIZER](n: Int) -> w(n|) r(n) -> r(1) -> mark(n + 1) call(n + 1, plus|, ) -> ret(*|) L5 L5: NEXT:[] error: PREV:[] sink: PREV:[, ] ===================== == bar == fun bar(n: Int) = n - 1 --------------------- L8: 4 v(n: Int) magic[FAKE_INITIALIZER](n: Int) -> w(n|) r(n) -> r(1) -> mark(n - 1) call(n - 1, minus|, ) -> ret(*|) L9 L9: NEXT:[] error: PREV:[] sink: PREV:[, ] =====================