| // NO_CHECK_LAMBDA_INLINING | |
| // FILE: 1.kt | |
| inline fun <T> run(c: () -> T): T = c() | |
| // FILE: 2.kt | |
| interface Runnable { | |
| fun run(): String | |
| } | |
| interface RunnableString { | |
| fun run(s: String): String | |
| } | |
| fun fooInt(): String { | |
| val r = "O" | |
| val a = run { | |
| fun f(x: Int, y: String? = null): String = r + x + y | |
| f(1, "K") | |
| } | |
| return a | |
| } | |
| fun fooLong(): String { | |
| val r = "O" | |
| val a = run { | |
| fun f(x: Long, y: String? = null): String = r + x + y | |
| f(2, "K") | |
| } | |
| return a | |
| } | |
| fun fooLongInsideObject(): String { | |
| val r = "O" | |
| val a = object: Runnable { | |
| override fun run(): String { | |
| fun f(x: Long, y: String? = null): String = r + x + y | |
| return f(3, "K") | |
| } | |
| } | |
| return a.run() | |
| } | |
| fun fooLongCallableReference(): String { | |
| val r = "O" | |
| val a = run { | |
| fun f(x: Long, y: String? = null): String = r + x + y | |
| (::f).let { it(4, "K") } | |
| } | |
| return a | |
| } | |
| class A { | |
| fun fooLongSyntheticAccessor(capt: Int): String { | |
| val o: RunnableString = run { | |
| object: RunnableString { | |
| override fun run(captured: String): String { | |
| return { | |
| callPrivate(capt, captured) | |
| }.let { it() } | |
| } | |
| private fun callPrivate(x: Int, y: String?): String = "O" + x + y | |
| } | |
| } | |
| return o.run("K") | |
| } | |
| } | |
| fun box(): String { | |
| var res = fooInt() | |
| if (res != "O1K") return res | |
| res = fooLong() | |
| if (res != "O2K") return res | |
| res = fooLongInsideObject() | |
| if (res != "O3K") return res | |
| res = fooLongCallableReference() | |
| if (res != "O4K") return res | |
| res = A().fooLongSyntheticAccessor(5) | |
| if (res != "O5K") return res | |
| return "OK" | |
| } |