| // TARGET_BACKEND: JVM |
| // WITH_STDLIB |
| // SAM_CONVERSIONS: CLASS |
| // FILE: MyRunnable.java |
| public interface MyRunnable { |
| public void run(); |
| } |
| |
| // FILE: Foo.kt |
| package foo |
| import MyRunnable |
| |
| class A { |
| inline fun doWork(noinline job: () -> Unit) { |
| Runnable(job).run() |
| } |
| |
| fun doNoninlineWork(job: () -> Unit) { |
| Runnable(job).run() |
| } |
| } |
| |
| class B { |
| inline fun doWork(noinline job: () -> Unit) { |
| Runnable(job).run() |
| } |
| |
| fun doNonInlineWork(job: () -> Unit) { |
| MyRunnable(job).run() |
| } |
| } |
| |
| // FILE: test.kt |
| import foo.A |
| import foo.B |
| |
| fun classForName(name: String): Class<*>? = |
| try { |
| java.lang.Class.forName(name) |
| } catch (e: Throwable) { |
| null |
| } |
| |
| fun box(): String { |
| var result = false |
| A().doWork { result = true } |
| if (!result) return "Fail 1" |
| |
| result = false |
| A().doNoninlineWork { result = true } |
| if (!result) return "Fail 2" |
| |
| result = false |
| B().doWork { result = true } |
| if (!result) return "Fail 3" |
| |
| result = false |
| B().doNonInlineWork { result = true } |
| if (!result) return "Fail 4" |
| |
| val inlineWrapperA = classForName("foo.A\$sam\$i\$java_lang_Runnable$0") |
| if (inlineWrapperA == null) return "Fail 5: Can't find sam wrapper" |
| if (inlineWrapperA.modifiers and 1 == 0) return "Fail 6: inline sam wrapper is non-public" |
| |
| val wrapperA = classForName("foo.A\$sam\$java_lang_Runnable$0") |
| if (wrapperA == null) return "Fail 7: Can't find sam wrapper" |
| if (wrapperA.modifiers and 1 != 0) return "Fail 8: non-inline sam wrapper is public" |
| |
| val inlineWrapperB = classForName("foo.B\$sam\$i\$java_lang_Runnable$0") |
| if (inlineWrapperB != null) return "Fail 9: sam wrapper not cached" |
| |
| val wrapperB = classForName("foo.B\$sam\$MyRunnable$0") |
| if (wrapperB == null) return "Fail 10: Can't find sam wrapper" |
| if (wrapperB.modifiers and 1 != 0) return "Fail 11: non-inline sam wrapper is public" |
| |
| return "OK" |
| } |