// ERROR_POLICY: SEMANTIC // MODULE: lib // FILE: t.kt import kotlin.reflect.KClass var l = "" fun log(s: String, r: Any? = null): Any? { l += s + ";" return r } inline fun assertFails(block: () -> Unit) { try { block() } catch (e: Throwable) { return } fail("Expected an exception to be thrown, but was completed successfully.") } fun getKClassFromRaifed(b: Boolean): KClass? { log("getKClassFromRaifed($b)") if (b) return R::class log("getKClassFromRaifed: null") return null } fun getKClassFromT(b: Boolean): KClass? { log("getKClassFromT($b)") if (b) return T::class log("getKClassFromT: null") return null } fun getKClassFromErrorType(b: Boolean): KClass<*>? { log("getKClassFromErrorType($b)") if (b) return ErrT::class log("getKClassFromErrorType: null") return null } inline fun test1() { assertFails { getKClassFromRaifed(true) } assertFails { getKClassFromRaifed(true) } assertFails { getKClassFromRaifed(true) } assertFails { getKClassFromT(true) } assertFails { getKClassFromT(true) } assertFails { getKClassFromT(true) } assertFails { getKClassFromErrorType(true) } getKClassFromRaifed(false) getKClassFromRaifed(false) getKClassFromRaifed(false) getKClassFromT(false) getKClassFromT(false) getKClassFromT(false) getKClassFromErrorType(false) } inline fun foo(a: Any, b: Any, c: Any): KClass<*>? { log("foo") return R::class } fun testSideEffects() { assertFails { foo(log("1", 1), log("2", 2), log("3", 3)) } foo(log("a", 1), log("b", 2), log("c", 3)) } // MODULE: main(lib) // FILE: b.kt fun box(): String { test1() testSideEffects() val expected = "getKClassFromRaifed(true);getKClassFromRaifed(true);getKClassFromRaifed(true);" + "getKClassFromT(true);getKClassFromT(true);getKClassFromT(true);" + "getKClassFromErrorType(true);" + "getKClassFromRaifed(false);getKClassFromRaifed: null;getKClassFromRaifed(false);getKClassFromRaifed: null;getKClassFromRaifed(false);getKClassFromRaifed: null;" + "getKClassFromT(false);getKClassFromT: null;getKClassFromT(false);getKClassFromT: null;getKClassFromT(false);getKClassFromT: null;" + "getKClassFromErrorType(false);getKClassFromErrorType: null;" + "1;2;3;foo;a;b;c;foo;" if (l != expected) return "l = $l" return "OK" }