| /* |
| * Copyright 2010-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license |
| * that can be found in the LICENSE file. |
| */ |
| // 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" |
| } |