| // TARGET_BACKEND: JS_IR, JS_IR_ES6 | |
| // IGNORE_BACKEND: JS_IR, JS_IR_ES6 | |
| // ISSUE: KT-64652 | |
| // FILE: lib.kt | |
| sealed class C { | |
| class X : C() | |
| class Y : C() | |
| } | |
| enum class E { | |
| X, Y | |
| } | |
| inline fun createWrongC(): C = js("{ name: 'Z' }").unsafeCast<C>() | |
| inline fun createWrongE(): E = js("{ name: 'Z' }").unsafeCast<E>() | |
| // FILE: main.kt | |
| fun <T> checkThrown(x: T, block: (T) -> Any?): Unit? { | |
| return try { | |
| block(x) | |
| null | |
| } | |
| catch (e: NoWhenBranchMatchedException) { | |
| Unit | |
| } | |
| } | |
| fun <T> checkNotThrown(x: T, block: (T) -> Any?): Unit? { | |
| return try { | |
| block(x) | |
| Unit | |
| } | |
| catch (e: NoWhenBranchMatchedException) { | |
| null | |
| } | |
| } | |
| fun box(): String { | |
| checkThrown(createWrongC()) { | |
| when (it) { | |
| is C.X -> 0 | |
| is C.Y -> 1 | |
| } | |
| } ?: return "fail1" | |
| checkNotThrown(createWrongC()) { | |
| when (it) { | |
| is C.X -> 0 | |
| else -> 1 | |
| } | |
| } ?: return "fail2" | |
| checkThrown(createWrongE()) { | |
| when (it) { | |
| E.X -> 0 | |
| E.Y -> 1 | |
| } | |
| } ?: return "fail3" | |
| checkNotThrown(createWrongE()) { | |
| when (it) { | |
| E.X -> 0 | |
| else -> 1 | |
| } | |
| } ?: return "fail4" | |
| checkNotThrown(createWrongC()) { | |
| when (it) { | |
| is C.X -> {} | |
| is C.Y -> {} | |
| } | |
| Unit | |
| } ?: return "fail5" | |
| checkNotThrown(createWrongC()) { | |
| when (it) { | |
| is C.X -> {} | |
| is C.Y -> {} | |
| } | |
| } ?: return "fail6" | |
| checkNotThrown(createWrongC()) { | |
| when (it) { | |
| is C.X -> Unit | |
| is C.Y -> Unit | |
| } | |
| } ?: return "fail7" | |
| checkThrown(createWrongC()) { | |
| when (it) { | |
| is C.X -> Unit | |
| is C.Y -> null as Unit? | |
| } | |
| } ?: return "fail8" | |
| return "OK" | |
| } |