| // NO_CHECK_LAMBDA_INLINING |
| // WITH_STDLIB |
| // TARGET_BACKEND: JVM |
| // ASSERTIONS_MODE: jvm |
| // FILE: inline.kt |
| |
| package test |
| |
| object CrossinlineLambdaContainer { |
| inline fun call(crossinline c: () -> Boolean) { |
| val l = { assert(c()) } |
| l() |
| } |
| } |
| |
| // FILE: inlineSite.kt |
| |
| import test.CrossinlineLambdaContainer.call |
| |
| interface Checker { |
| fun checkTrue(): Boolean |
| fun checkFalse(): Boolean |
| } |
| |
| class ShouldBeDisabled : Checker { |
| override fun checkTrue(): Boolean { |
| var hit = false |
| call { hit = true; true } |
| return hit |
| } |
| |
| override fun checkFalse(): Boolean { |
| var hit = false |
| call { hit = true; false } |
| return hit |
| } |
| } |
| |
| class ShouldBeEnabled : Checker { |
| override fun checkTrue(): Boolean { |
| var hit = false |
| call { hit = true; true } |
| return hit |
| } |
| |
| override fun checkFalse(): Boolean { |
| var hit = false |
| call { hit = true; false } |
| return hit |
| } |
| } |
| |
| fun setDesiredAssertionStatus(v: Boolean): Checker { |
| val loader = Checker::class.java.classLoader |
| loader.setDefaultAssertionStatus(v) |
| val c = loader.loadClass(if (v) "ShouldBeEnabled" else "ShouldBeDisabled") |
| return c.newInstance() as Checker |
| } |
| |
| fun box(): String { |
| var c = setDesiredAssertionStatus(false) |
| if (c.checkTrue()) return "FAIL 0" |
| if (c.checkFalse()) return "FAIL 2" |
| c = setDesiredAssertionStatus(true) |
| if (!c.checkTrue()) return "FAIL 4" |
| try { |
| c.checkFalse() |
| return "FAIL 6" |
| } catch (ignore: AssertionError) { |
| } |
| return "OK" |
| } |