== A == class A { val x: Int var y: Int val z: Int val v = -1 constructor() { x = 1 y = 2 } constructor(a: Int, b: Int = 3) { x = a y = x } //anonymous init { z = 8 } constructor(a: String, b: Int = 4): this() { y = 5 } constructor(a: Double, b: Int = 6): this(a.toInt()) { y = 7 } // anonymous init { y = 9 } } --------------------- L0: 1 L1: NEXT:[] error: PREV:[] sink: PREV:[, ] ===================== == A == constructor() { x = 1 y = 2 } --------------------- L0: 1 mark() call(, ) -> v(val x: Int) v(var y: Int) v(val z: Int) v(val v = -1) r(1) -> mark(-1) call(-1, unaryMinus|) -> w(v|) 2 mark({ z = 8 }) magic[IMPLICIT_RECEIVER](z) -> r(8) -> w(z|, ) mark({ y = 9 }) magic[IMPLICIT_RECEIVER](y) -> r(9) -> w(y|, ) mark({ x = 1 y = 2 }) magic[IMPLICIT_RECEIVER](x) -> r(1) -> w(x|, ) magic[IMPLICIT_RECEIVER](y) -> r(2) -> w(y|, ) L1: 1 NEXT:[] error: PREV:[] sink: PREV:[, ] ===================== == A == constructor(a: Int, b: Int = 3) { x = a y = x } --------------------- L0: 1 v(a: Int) magic[FAKE_INITIALIZER](a: Int) -> w(a|) v(b: Int = 3) jmp?(L2) NEXT:[magic[FAKE_INITIALIZER](b: Int = 3) -> , r(3) -> ] r(3) -> L2 [after default value for parameter b]: magic[FAKE_INITIALIZER](b: Int = 3) -> PREV:[jmp?(L2), r(3) -> ] merge(b: Int = 3|, ) -> w(b|) mark() call(, ) -> v(val x: Int) v(var y: Int) v(val z: Int) v(val v = -1) r(1) -> mark(-1) call(-1, unaryMinus|) -> w(v|) 2 mark({ z = 8 }) magic[IMPLICIT_RECEIVER](z) -> r(8) -> w(z|, ) mark({ y = 9 }) magic[IMPLICIT_RECEIVER](y) -> r(9) -> w(y|, ) mark({ x = a y = x }) magic[IMPLICIT_RECEIVER](x) -> r(a) -> w(x|, ) magic[IMPLICIT_RECEIVER](y) -> magic[IMPLICIT_RECEIVER](x) -> r(x|) -> w(y|, ) L1: 1 NEXT:[] error: PREV:[] sink: PREV:[, ] ===================== == A == constructor(a: String, b: Int = 4): this() { y = 5 } --------------------- L0: 1 v(a: String) magic[FAKE_INITIALIZER](a: String) -> w(a|) v(b: Int = 4) jmp?(L2) NEXT:[magic[FAKE_INITIALIZER](b: Int = 4) -> , r(4) -> ] r(4) -> L2 [after default value for parameter b]: magic[FAKE_INITIALIZER](b: Int = 4) -> PREV:[jmp?(L2), r(4) -> ] merge(b: Int = 4|, ) -> w(b|) mark(this()) call(this(), ) -> 2 mark({ y = 5 }) magic[IMPLICIT_RECEIVER](y) -> r(5) -> w(y|, ) L1: 1 NEXT:[] error: PREV:[] sink: PREV:[, ] ===================== == A == constructor(a: Double, b: Int = 6): this(a.toInt()) { y = 7 } --------------------- L0: 1 v(a: Double) magic[FAKE_INITIALIZER](a: Double) -> w(a|) v(b: Int = 6) jmp?(L2) NEXT:[magic[FAKE_INITIALIZER](b: Int = 6) -> , r(6) -> ] r(6) -> L2 [after default value for parameter b]: magic[FAKE_INITIALIZER](b: Int = 6) -> PREV:[jmp?(L2), r(6) -> ] merge(b: Int = 6|, ) -> w(b|) mark(a.toInt()) r(a) -> mark(toInt()) call(toInt(), toInt|) -> mark(this(a.toInt())) call(this(a.toInt()), |) -> 2 mark({ y = 7 }) magic[IMPLICIT_RECEIVER](y) -> r(7) -> w(y|, ) L1: 1 NEXT:[] error: PREV:[] sink: PREV:[, ] =====================