== x == var x: Int --------------------- L0: 1 INIT: in: {} out: {} v(var x: Int) INIT: in: {} out: {x=D} L1: INIT: in: {x=D} out: {x=D} error: INIT: in: {} out: {} sink: INIT: in: {x=-} out: {x=-} USE: in: {} out: {} ===================== == foo == fun foo(f: Boolean) { try { if (f) { x = 0 } } finally { fun bar() {} } } --------------------- L0: 1 INIT: in: {} out: {} v(f: Boolean) INIT: in: {} out: {} magic[FAKE_INITIALIZER](f: Boolean) -> INIT: in: {} out: {} w(f|) INIT: in: {} out: {} 2 mark({ try { if (f) { x = 0 } } finally { fun bar() {} } }) INIT: in: {} out: {} mark(try { if (f) { x = 0 } } finally { fun bar() {} }) jmp?(L2) 3 mark({ if (f) { x = 0 } }) mark(if (f) { x = 0 }) r(f) -> jf(L3|) 4 mark({ x = 0 }) r(0) -> w(x|) 3 jmp(L4) L3 [else branch]: read (Unit) L4 ['if' expression result]: merge(if (f) { x = 0 }|!) -> 2 jmp?(L2) jmp(L5) L2 [onExceptionToFinallyBlock]: L6 [start finally]: 3 mark({ fun bar() {} }) jmp?(L7) d(fun bar() {}) L7 [after local declaration]: L10 [finish finally]: 2 jmp(error) L5 [skipFinallyToErrorBlock]: L11 [copy of L2, onExceptionToFinallyBlock]: 3 mark({ fun bar() {} }) jmp?(L12) d(fun bar() {}) L12 [copy of L7, after local declaration]: 2 merge(try { if (f) { x = 0 } } finally { fun bar() {} }|) -> L1: 1 error: sink: USE: in: {} out: {} ===================== == bar == fun bar() {} --------------------- L8: 4 INIT: in: {} out: {} 5 mark({}) read (Unit) L9: 4 error: sink: USE: in: {} out: {} ===================== == bar == fun bar() {} --------------------- L2 [copy of L8, null]: 4 INIT: in: {} out: {} 5 mark({}) read (Unit) L3 [copy of L9, null]: 4 L0 [copy of error, null]: L1 [copy of sink, null]: USE: in: {} out: {} =====================