// Super calls to Throwable properties are not supported // IGNORE_BACKEND: JS_IR // IGNORE_BACKEND: JS_IR_ES6 open class Base(message: String? = null, cause: Throwable? = null) : Throwable(message, cause) open class Base2(message: String? = null, cause: Throwable? = null): Base(message, cause) open class Override(message: String? = null, cause: Throwable? = null) : Base2(message, cause) { var i = 0 override val message: String? get() = "Override: " + super.message + "${i++}" } open class OverBase(message: String? = null, cause: Throwable? = null): Override(message, cause) open class OverOverride(message: String? = null, cause: Throwable? = null) : OverBase(message, cause) { override val message: String? get() = "OverOver: " + super.message + "${i++}" override val cause: Throwable? get() = super.cause ?: this } fun box(): String { check(Base("O", Base("K")), "OK") check(Override("OK"), "Override: OK0") check(OverOverride("OK"), "OverOver: Override: OK01OverOver: Override: OK23") return "OK" } fun check(t: Throwable, msg: String) { try { throw t } catch (e: Throwable) { val c = t.cause val m = if (c != null) t.message!! + c.message!! else t.message!! if (m != msg) throw AssertionError(m) } }