| // NO_CHECK_LAMBDA_INLINING |
| // FILE: lib.kt |
| class TestData(var status: String) { |
| fun updateStatus(newStatus: String) { |
| status = newStatus |
| } |
| } |
| |
| inline fun <T> inlineGenericTestFunction(f: () -> T) = f() |
| |
| inline fun inlineFunction(f: () -> Unit) = f() |
| |
| // FILE: main.kt |
| fun testCase1(obj: TestData) = inlineFunction { |
| class InlineClass |
| |
| val updateStatus = inlineGenericTestFunction { |
| fun localFunction() { obj.status = "OK" } |
| ::localFunction |
| } |
| updateStatus() |
| } |
| |
| fun testCase2(obj: TestData) = inlineFunction { |
| class InlineClass |
| |
| val updateStatus = inlineGenericTestFunction { |
| fun localFunction(msg: String) { obj.status = msg } |
| ::localFunction |
| } |
| updateStatus("OK") |
| } |
| |
| fun testCase3(obj: TestData) = inlineFunction { |
| class InlineClass |
| |
| val updateStatus = inlineGenericTestFunction { |
| fun localFunction(flag: Boolean, msg: String) { obj.status = if (flag) msg else "ERROR" } |
| ::localFunction |
| } |
| updateStatus(true, "OK") |
| } |
| |
| fun testCase4(obj: TestData) = inlineFunction { |
| class InlineClass |
| |
| val updateStatus: String.() -> Unit = inlineGenericTestFunction { |
| fun String.localFunction() { obj.status = this } |
| String::localFunction |
| } |
| updateStatus("ERROR") |
| "OK".updateStatus() |
| } |
| |
| fun testCase5(obj: TestData) = inlineFunction { |
| class InlineClass |
| |
| val updateStatus: () -> Unit = inlineGenericTestFunction { |
| fun String.localFunction() { obj.status = this } |
| "OK"::localFunction |
| } |
| updateStatus() |
| } |
| |
| fun testCase6(obj: TestData) = inlineFunction { |
| class InlineClass |
| |
| val updateStatus: TestData.(String) -> Unit = inlineGenericTestFunction { |
| fun TestData.localFunction(msg: String) { status = msg } |
| TestData::localFunction |
| } |
| updateStatus(obj, "ERROR") |
| obj.updateStatus("OK") |
| } |
| |
| fun testCase7(obj: TestData) = inlineFunction { |
| class InlineClass |
| |
| val updateStatus: (String) -> Unit = inlineGenericTestFunction { |
| fun TestData.localFunction(msg: String) { status = msg } |
| obj::localFunction |
| } |
| updateStatus("OK") |
| } |
| |
| fun testCase8(obj: TestData) = inlineFunction { |
| class InlineClass |
| |
| val updateStatus: (String) -> Unit = inlineGenericTestFunction { |
| obj::updateStatus |
| } |
| updateStatus("OK") |
| } |
| |
| fun testCase9(obj: TestData) = inlineFunction { |
| class InlineClass |
| |
| val updateStatus: String.() -> Unit = inlineGenericTestFunction { |
| { obj.updateStatus(this) } |
| } |
| updateStatus("ERROR") |
| "OK".updateStatus() |
| } |
| |
| fun testCase10(obj: TestData) = inlineFunction { |
| class InlineClass |
| |
| val updateStatus: String.() -> Unit = inlineGenericTestFunction { |
| fun <T> T.localFunction() { obj.status = this.toString() } |
| String::localFunction |
| } |
| updateStatus("ERROR") |
| "OK".updateStatus() |
| } |
| |
| fun testCase11(obj: TestData) { |
| fun testCaseImpl(msg: String) = inlineFunction { |
| class InlineClass |
| |
| val updateStatus: (Boolean) -> Unit = inlineGenericTestFunction { |
| fun TestData.localFunction(flag: Boolean) { status = if (flag) msg else "ERROR" } |
| obj::localFunction |
| } |
| updateStatus(true) |
| } |
| testCaseImpl("OK") |
| } |
| |
| fun testCase12(obj: TestData) { |
| fun testCaseImpl(msg: String) = inlineFunction { |
| class InlineClass |
| |
| val updateStatus: TestData.(Boolean) -> Unit = inlineGenericTestFunction { |
| fun TestData.localFunction(flag: Boolean) { status = if (flag) msg else "ERROR" } |
| TestData::localFunction |
| } |
| updateStatus(obj, false) |
| obj.updateStatus(true) |
| } |
| testCaseImpl("OK") |
| } |
| |
| fun testCase13(obj: TestData) { |
| fun testCaseImpl(msg: String) = inlineFunction { |
| class InlineClass |
| |
| val updateStatus: (Boolean) -> Unit = inlineGenericTestFunction { |
| fun <T, F> T.localFunction(flag: F) { obj.status = if (flag!!.equals(true)) this.toString() else "ERROR" } |
| msg::localFunction |
| } |
| updateStatus(false) |
| updateStatus(true) |
| } |
| testCaseImpl("OK") |
| } |
| |
| fun checkTest(test: (TestData) -> Unit): Boolean { |
| val obj = TestData("Fail") |
| test(obj) |
| return obj.status == "OK" |
| } |
| |
| fun box(): String { |
| if (!checkTest(::testCase1)) return "Fail case 1" |
| if (!checkTest(::testCase2)) return "Fail case 2" |
| if (!checkTest(::testCase3)) return "Fail case 3" |
| if (!checkTest(::testCase4)) return "Fail case 4" |
| if (!checkTest(::testCase5)) return "Fail case 5" |
| if (!checkTest(::testCase6)) return "Fail case 6" |
| if (!checkTest(::testCase7)) return "Fail case 7" |
| if (!checkTest(::testCase8)) return "Fail case 8" |
| if (!checkTest(::testCase9)) return "Fail case 9" |
| if (!checkTest(::testCase10)) return "Fail case 10" |
| if (!checkTest(::testCase11)) return "Fail case 11" |
| if (!checkTest(::testCase12)) return "Fail case 12" |
| if (!checkTest(::testCase13)) return "Fail case 13" |
| |
| return "OK" |
| } |