| // TODO: check mentioned debug output of escape analyser | |
| // Note: intentional infinite mutual recursion with `A(String)` and `C()`. Don't try to execute the code. | |
| class A(val s: String) { | |
| var h: String = "" | |
| var p: C = C() | |
| } | |
| class B { | |
| var f: A = A("qzz") | |
| } | |
| class C { | |
| var g: A = A("") | |
| } | |
| class D { | |
| var o: A = A("") | |
| } | |
| // ----- Agressive ----- | |
| // PointsTo: | |
| // P1.g -> D0 | |
| // P2.f -> D0 | |
| // P4.o -> P1.g | |
| // P4.o -> P2.f | |
| // P4.o -> D0 | |
| // RET.v@lue -> D1 | |
| // D0.p -> P1 | |
| // D0.h -> P3 | |
| // Escapes: D1 | |
| // ----- Passive ----- | |
| // PointsTo: | |
| // P1.g -> D0 | |
| // P2.f -> D0 | |
| // P4.o -> P1.g | |
| // P4.o -> P2.f | |
| // P4.o -> D0 | |
| // RET.v@lue -> D1 | |
| // D0.p -> P1 | |
| // D0.h -> P3 | |
| // Escapes: D1 | |
| fun foo(z: Boolean, c: C, b: B, s: String, d: D) { | |
| val v = if(z) c.g else b.f | |
| v.h = s | |
| d.o = v | |
| val u = v | |
| u.p = c | |
| } | |
| fun box(): String { | |
| // When uncommented, execution of the following line would fall into infinite recursion | |
| // foo(true, C(), B(), "zzz", D()) | |
| return "OK" | |
| } |