Support is/as/as? with Function[K]<...> types.

This commit is contained in:
Dmitry Petrov
2015-10-02 19:37:53 +03:00
parent e1d53a2843
commit 9e546bda27
22 changed files with 2177 additions and 160 deletions
@@ -0,0 +1,5 @@
class JFun implements kotlin.jvm.functions.Function0<String> {
public String invoke() {
return "OK";
}
}
@@ -0,0 +1,6 @@
fun box(): String {
val jfun = JFun()
val jf = jfun as Any
if (jf is Function0<*>) return jfun()
else return "Failed: jf is Function0<*>"
}
@@ -0,0 +1,250 @@
// This is a big, ugly, semi-auto generated test.
// Use corresponding 'Small' test for debug.
import kotlin.test.*
fun fn0() {}
fun fn1(x0: Any) {}
fun fn2(x0: Any, x1: Any) {}
fun fn3(x0: Any, x1: Any, x2: Any) {}
fun fn4(x0: Any, x1: Any, x2: Any, x3: Any) {}
fun fn5(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any) {}
fun fn6(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any) {}
fun fn7(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any) {}
fun fn8(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any) {}
fun fn9(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any) {}
fun fn10(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any) {}
fun fn11(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any) {}
fun fn12(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any) {}
fun fn13(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any) {}
fun fn14(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any) {}
fun fn15(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any) {}
fun fn16(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any) {}
fun fn17(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any) {}
fun fn18(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any, x17: Any) {}
fun fn19(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any, x17: Any, x18: Any) {}
fun fn20(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any, x17: Any, x18: Any, x19: Any) {}
fun fn21(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any, x17: Any, x18: Any, x19: Any, x20: Any) {}
fun fn22(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any, x17: Any, x18: Any, x19: Any, x20: Any, x21: Any) {}
val fns = arrayOf<Any>(::fn0, ::fn1, ::fn2, ::fn3, ::fn4, ::fn5, ::fn6, ::fn7, ::fn8, ::fn9,
::fn10, ::fn11, ::fn12, ::fn13, ::fn14, ::fn15, ::fn16, ::fn17, ::fn18, ::fn19,
::fn20, ::fn21, ::fn22)
inline fun asFailsWithCCE(operation: String, crossinline block: () -> Unit) {
assertFailsWith(ClassCastException::class.java, "$operation should throw an exception") {
block()
}
}
inline fun asSucceeds(operation: String, block: () -> Unit) {
block()
}
interface TestFnBase {
fun testGood(x: Any)
fun testBad(x: Any)
}
object TestFn0 : TestFnBase {
override fun testGood(x: Any) { x as Function0<*> }
override fun testBad(x: Any) =
asFailsWithCCE("x as Function0<*>") {
x as Function0<*>
}
}
object TestFn1 : TestFnBase {
override fun testGood(x: Any) { x as Function1<*, *> }
override fun testBad(x: Any) =
asFailsWithCCE("x as Function1<*, *>") {
x as Function1<*, *>
}
}
object TestFn2 : TestFnBase {
override fun testGood(x: Any) { x as Function2<*, *, *> }
override fun testBad(x: Any) =
asFailsWithCCE("x as Function2<*, *, *>") {
x as Function2<*, *, *>
}
}
object TestFn3 : TestFnBase {
override fun testGood(x: Any) { x as Function3<*, *, *, *> }
override fun testBad(x: Any) =
asFailsWithCCE("x as Function3<*, *, *, *>") {
x as Function3<*, *, *, *>
}
}
object TestFn4 : TestFnBase {
override fun testGood(x: Any) { x as Function4<*, *, *, *, *> }
override fun testBad(x: Any) =
asFailsWithCCE("x as Function4<*, *, *, *, *>") {
x as Function4<*, *, *, *, *>
}
}
object TestFn5 : TestFnBase {
override fun testGood(x: Any) { x as Function5<*, *, *, *, *, *> }
override fun testBad(x: Any) =
asFailsWithCCE("x as Function5<*, *, *, *, *, *>") {
x as Function5<*, *, *, *, *, *>
}
}
object TestFn6 : TestFnBase {
override fun testGood(x: Any) { x as Function6<*, *, *, *, *, *, *> }
override fun testBad(x: Any) =
asFailsWithCCE("x as Function6<*, *, *, *, *, *, *>") {
x as Function6<*, *, *, *, *, *, *>
}
}
object TestFn7 : TestFnBase {
override fun testGood(x: Any) { x as Function7<*, *, *, *, *, *, *, *> }
override fun testBad(x: Any) =
asFailsWithCCE("x as Function7<*, *, *, *, *, *, *, *>") {
x as Function7<*, *, *, *, *, *, *, *>
}
}
object TestFn8 : TestFnBase {
override fun testGood(x: Any) { x as Function8<*, *, *, *, *, *, *, *, *> }
override fun testBad(x: Any) =
asFailsWithCCE("x as Function8<*, *, *, *, *, *, *, *, *>") {
x as Function8<*, *, *, *, *, *, *, *, *>
}
}
object TestFn9 : TestFnBase {
override fun testGood(x: Any) { x as Function9<*, *, *, *, *, *, *, *, *, *> }
override fun testBad(x: Any) =
asFailsWithCCE("x as Function9<*, *, *, *, *, *, *, *, *, *>") {
x as Function9<*, *, *, *, *, *, *, *, *, *>
}
}
object TestFn10 : TestFnBase {
override fun testGood(x: Any) { x as Function10<*, *, *, *, *, *, *, *, *, *, *> }
override fun testBad(x: Any) =
asFailsWithCCE("x as Function10<*, *, *, *, *, *, *, *, *, *, *>") {
x as Function10<*, *, *, *, *, *, *, *, *, *, *>
}
}
object TestFn11 : TestFnBase {
override fun testGood(x: Any) { x as Function11<*, *, *, *, *, *, *, *, *, *, *, *> }
override fun testBad(x: Any) =
asFailsWithCCE("x as Function11<*, *, *, *, *, *, *, *, *, *, *, *>") {
x as Function11<*, *, *, *, *, *, *, *, *, *, *, *>
}
}
object TestFn12 : TestFnBase {
override fun testGood(x: Any) { x as Function12<*, *, *, *, *, *, *, *, *, *, *, *, *> }
override fun testBad(x: Any) =
asFailsWithCCE("x as Function12<*, *, *, *, *, *, *, *, *, *, *, *, *>") {
x as Function12<*, *, *, *, *, *, *, *, *, *, *, *, *>
}
}
object TestFn13 : TestFnBase {
override fun testGood(x: Any) { x as Function13<*, *, *, *, *, *, *, *, *, *, *, *, *, *> }
override fun testBad(x: Any) =
asFailsWithCCE("x as Function13<*, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
x as Function13<*, *, *, *, *, *, *, *, *, *, *, *, *, *>
}
}
object TestFn14 : TestFnBase {
override fun testGood(x: Any) { x as Function14<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *> }
override fun testBad(x: Any) =
asFailsWithCCE("x as Function14<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
x as Function14<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *>
}
}
object TestFn15 : TestFnBase {
override fun testGood(x: Any) { x as Function15<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *> }
override fun testBad(x: Any) =
asFailsWithCCE("x as Function15<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
x as Function15<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>
}
}
object TestFn16 : TestFnBase {
override fun testGood(x: Any) { x as Function16<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *> }
override fun testBad(x: Any) =
asFailsWithCCE("x as Function16<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
x as Function16<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>
}
}
object TestFn17 : TestFnBase {
override fun testGood(x: Any) { x as Function17<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *> }
override fun testBad(x: Any) =
asFailsWithCCE("x as Function17<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
x as Function17<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>
}
}
object TestFn18 : TestFnBase {
override fun testGood(x: Any) { x as Function18<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *> }
override fun testBad(x: Any) =
asFailsWithCCE("x as Function18<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
x as Function18<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>
}
}
object TestFn19 : TestFnBase {
override fun testGood(x: Any) { x as Function19<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *> }
override fun testBad(x: Any) =
asFailsWithCCE("x as Function19<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
x as Function19<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>
}
}
object TestFn20 : TestFnBase {
override fun testGood(x: Any) { x as Function20<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *> }
override fun testBad(x: Any) =
asFailsWithCCE("x as Function20<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
x as Function20<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>
}
}
object TestFn21 : TestFnBase {
override fun testGood(x: Any) { x as Function21<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *> }
override fun testBad(x: Any) =
asFailsWithCCE("x as Function21<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
x as Function21<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>
}
}
object TestFn22 : TestFnBase {
override fun testGood(x: Any) { x as Function22<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *> }
override fun testBad(x: Any) =
asFailsWithCCE("x as Function22<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
x as Function22<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>
}
}
val tests = arrayOf<TestFnBase>(TestFn0, TestFn1, TestFn2, TestFn3, TestFn4, TestFn5, TestFn6, TestFn7, TestFn8, TestFn9,
TestFn10, TestFn11, TestFn12, TestFn13, TestFn14, TestFn15, TestFn16, TestFn17, TestFn18, TestFn19,
TestFn20, TestFn21, TestFn22)
fun box(): String {
for (fnI in 0 .. 22) {
for (testI in 0 .. 22) {
if (fnI == testI) {
tests[testI].testGood(fns[fnI])
}
else {
tests[testI].testBad(fns[fnI])
}
}
}
return "OK"
}
@@ -0,0 +1,44 @@
fun fn0() {}
fun fn1(x: Any) {}
inline fun asFailsWithCCE(operation: String, block: () -> Unit) {
try {
block()
}
catch (e: java.lang.ClassCastException) {
return
}
catch (e: Throwable) {
throw AssertionError("$operation: should throw ClassCastException, got $e")
}
throw AssertionError("$operation: should throw ClassCastException, no exception thrown")
}
inline fun asSucceeds(operation: String, block: () -> Unit) {
try {
block()
}
catch (e: Throwable) {
throw AssertionError("$operation: should not throw exceptions, got $e")
}
}
class MyFun: Function<Any>
fun box(): String {
val f0 = ::fn0 as Any
val f1 = ::fn1 as Any
val myFun = MyFun() as Any
asSucceeds("f0 as Function0<*>") { f0 as Function0<*> }
asFailsWithCCE("f0 as Function1<*, *>") { f0 as Function1<*, *> }
asFailsWithCCE("f1 as Function0<*>") { f1 as Function0<*> }
asSucceeds("f1 as Function1<*, *>") { f1 as Function1<*, *> }
asFailsWithCCE("myFun as Function0<*>") { myFun as Function0<*> }
asFailsWithCCE("myFun as Function1<*, *>") { myFun as Function1<*, *> }
return "OK"
}
@@ -0,0 +1,177 @@
// This is a big, ugly, semi-auto generated test.
// Use corresponding 'Small' test for debug.
fun fn0() {}
fun fn1(x0: Any) {}
fun fn2(x0: Any, x1: Any) {}
fun fn3(x0: Any, x1: Any, x2: Any) {}
fun fn4(x0: Any, x1: Any, x2: Any, x3: Any) {}
fun fn5(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any) {}
fun fn6(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any) {}
fun fn7(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any) {}
fun fn8(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any) {}
fun fn9(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any) {}
fun fn10(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any) {}
fun fn11(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any) {}
fun fn12(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any) {}
fun fn13(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any) {}
fun fn14(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any) {}
fun fn15(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any) {}
fun fn16(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any) {}
fun fn17(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any) {}
fun fn18(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any, x17: Any) {}
fun fn19(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any, x17: Any, x18: Any) {}
fun fn20(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any, x17: Any, x18: Any, x19: Any) {}
fun fn21(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any, x17: Any, x18: Any, x19: Any, x20: Any) {}
fun fn22(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any, x17: Any, x18: Any, x19: Any, x20: Any, x21: Any) {}
val fns = arrayOf<Any>(::fn0, ::fn1, ::fn2, ::fn3, ::fn4, ::fn5, ::fn6, ::fn7, ::fn8, ::fn9,
::fn10, ::fn11, ::fn12, ::fn13, ::fn14, ::fn15, ::fn16, ::fn17, ::fn18, ::fn19,
::fn20, ::fn21, ::fn22)
abstract class TestFnBase(val type: String) {
abstract fun testGood(x: Any)
abstract fun testBad(x: Any)
protected fun assertIs(x: Any, condition: Boolean) {
assert(condition) { "x is $type: failed for $x" }
}
protected fun assertIsNot(x: Any, condition: Boolean) {
assert(condition) { "x !is $type: failed for $x" }
}
}
object TestFn0 : TestFnBase("Function0<*>") {
override fun testGood(x: Any) { assertIs(x, x is Function0<*>) }
override fun testBad(x: Any) { assertIsNot(x, x !is Function0<*>) }
}
object TestFn1 : TestFnBase("Function1<*, *>") {
override fun testGood(x: Any) { assertIs(x, x is Function1<*, *>) }
override fun testBad(x: Any) { assertIsNot(x, x !is Function1<*, *>) }
}
object TestFn2 : TestFnBase("Function2<*, *, *>") {
override fun testGood(x: Any) { assertIs(x, x is Function2<*, *, *>) }
override fun testBad(x: Any) { assertIsNot(x, x !is Function2<*, *, *>) }
}
object TestFn3 : TestFnBase("Function3<*, *, *, *>") {
override fun testGood(x: Any) { assertIs(x, x is Function3<*, *, *, *>) }
override fun testBad(x: Any) { assertIsNot(x, x !is Function3<*, *, *, *>) }
}
object TestFn4 : TestFnBase("Function4<*, *, *, *, *>") {
override fun testGood(x: Any) { assertIs(x, x is Function4<*, *, *, *, *>) }
override fun testBad(x: Any) { assertIsNot(x, x !is Function4<*, *, *, *, *>) }
}
object TestFn5 : TestFnBase("Function5<*, *, *, *, *, *>") {
override fun testGood(x: Any) { assertIs(x, x is Function5<*, *, *, *, *, *>) }
override fun testBad(x: Any) { assertIsNot(x, x !is Function5<*, *, *, *, *, *>) }
}
object TestFn6 : TestFnBase("Function6<*, *, *, *, *, *, *>") {
override fun testGood(x: Any) { assertIs(x, x is Function6<*, *, *, *, *, *, *>) }
override fun testBad(x: Any) { assertIsNot(x, x !is Function6<*, *, *, *, *, *, *>) }
}
object TestFn7 : TestFnBase("Function7<*, *, *, *, *, *, *, *>") {
override fun testGood(x: Any) { assertIs(x, x is Function7<*, *, *, *, *, *, *, *>) }
override fun testBad(x: Any) { assertIsNot(x, x !is Function7<*, *, *, *, *, *, *, *>) }
}
object TestFn8 : TestFnBase("Function8<*, *, *, *, *, *, *, *, *>") {
override fun testGood(x: Any) { assertIs(x, x is Function8<*, *, *, *, *, *, *, *, *>) }
override fun testBad(x: Any) { assertIsNot(x, x !is Function8<*, *, *, *, *, *, *, *, *>) }
}
object TestFn9 : TestFnBase("Function9<*, *, *, *, *, *, *, *, *, *>") {
override fun testGood(x: Any) { assertIs(x, x is Function9<*, *, *, *, *, *, *, *, *, *>) }
override fun testBad(x: Any) { assertIsNot(x, x !is Function9<*, *, *, *, *, *, *, *, *, *>) }
}
object TestFn10 : TestFnBase("Function10<*, *, *, *, *, *, *, *, *, *, *>") {
override fun testGood(x: Any) { assertIs(x, x is Function10<*, *, *, *, *, *, *, *, *, *, *>) }
override fun testBad(x: Any) { assertIsNot(x, x !is Function10<*, *, *, *, *, *, *, *, *, *, *>) }
}
object TestFn11 : TestFnBase("Function11<*, *, *, *, *, *, *, *, *, *, *, *>") {
override fun testGood(x: Any) { assertIs(x, x is Function11<*, *, *, *, *, *, *, *, *, *, *, *>) }
override fun testBad(x: Any) { assertIsNot(x, x !is Function11<*, *, *, *, *, *, *, *, *, *, *, *>) }
}
object TestFn12 : TestFnBase("Function12<*, *, *, *, *, *, *, *, *, *, *, *, *>") {
override fun testGood(x: Any) { assertIs(x, x is Function12<*, *, *, *, *, *, *, *, *, *, *, *, *>) }
override fun testBad(x: Any) { assertIsNot(x, x !is Function12<*, *, *, *, *, *, *, *, *, *, *, *, *>) }
}
object TestFn13 : TestFnBase("Function13<*, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
override fun testGood(x: Any) { assertIs(x, x is Function13<*, *, *, *, *, *, *, *, *, *, *, *, *, *>) }
override fun testBad(x: Any) { assertIsNot(x, x !is Function13<*, *, *, *, *, *, *, *, *, *, *, *, *, *>) }
}
object TestFn14 : TestFnBase("Function14<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
override fun testGood(x: Any) { assertIs(x, x is Function14<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *>) }
override fun testBad(x: Any) { assertIsNot(x, x !is Function14<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *>) }
}
object TestFn15 : TestFnBase("Function15<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
override fun testGood(x: Any) { assertIs(x, x is Function15<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>) }
override fun testBad(x: Any) { assertIsNot(x, x !is Function15<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>) }
}
object TestFn16 : TestFnBase("Function16<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
override fun testGood(x: Any) { assertIs(x, x is Function16<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>) }
override fun testBad(x: Any) { assertIsNot(x, x !is Function16<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>) }
}
object TestFn17 : TestFnBase("Function17<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
override fun testGood(x: Any) { assertIs(x, x is Function17<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>) }
override fun testBad(x: Any) { assertIsNot(x, x !is Function17<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>) }
}
object TestFn18 : TestFnBase("Function18<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
override fun testGood(x: Any) { assertIs(x, x is Function18<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>) }
override fun testBad(x: Any) { assertIsNot(x, x !is Function18<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>) }
}
object TestFn19 : TestFnBase("Function19<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
override fun testGood(x: Any) { assertIs(x, x is Function19<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>) }
override fun testBad(x: Any) { assertIsNot(x, x !is Function19<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>) }
}
object TestFn20 : TestFnBase("Function20<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
override fun testGood(x: Any) { assertIs(x, x is Function20<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>) }
override fun testBad(x: Any) { assertIsNot(x, x !is Function20<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>) }
}
object TestFn21 : TestFnBase("Function21<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
override fun testGood(x: Any) { assertIs(x, x is Function21<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>) }
override fun testBad(x: Any) { assertIsNot(x, x !is Function21<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>) }
}
object TestFn22 : TestFnBase("Function22<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
override fun testGood(x: Any) { assertIs(x, x is Function22<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>) }
override fun testBad(x: Any) { assertIsNot(x, x !is Function22<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>) }
}
val tests = arrayOf<TestFnBase>(TestFn0, TestFn1, TestFn2, TestFn3, TestFn4, TestFn5, TestFn6, TestFn7, TestFn8, TestFn9,
TestFn10, TestFn11, TestFn12, TestFn13, TestFn14, TestFn15, TestFn16, TestFn17, TestFn18, TestFn19,
TestFn20, TestFn21, TestFn22)
fun box(): String {
for (fnI in 0 .. 22) {
for (testI in 0 .. 22) {
if (fnI == testI) {
tests[testI].testGood(fns[fnI])
}
else {
tests[testI].testBad(fns[fnI])
}
}
}
return "OK"
}
@@ -0,0 +1,55 @@
fun fn0() {}
fun fn1(x: Any) {}
val lambda0 = {} as () -> Unit
val lambda1 = { x: Any -> } as (Any) -> Unit
fun Any.extFun() {}
var Any.extProp: String
get() = "extProp"
set(x: String) {}
class A {
fun foo() {}
}
fun box(): String {
val f0 = ::fn0 as Any
val f1 = ::fn1 as Any
val ef = Any::extFun as Any
val epg = Any::extProp.getter
val eps = Any::extProp.setter
val afoo = A::foo
fun local0() {}
fun local1(x: Any) {}
val localFun0 = ::local0 as Any
val localFun1 = ::local1 as Any
assert(f0 is Function0<*>) { "Failed: f0 is Function0<*>" }
assert(f1 is Function1<*, *>) { "Failed: f1 is Function1<*, *>" }
assert(f0 !is Function1<*, *>) { "Failed: f0 !is Function1<*, *>" }
assert(f1 !is Function0<*>) { "Failed: f1 !is Function0<*>" }
assert(lambda0 is Function0<*>) { "Failed: lambda0 is Function0<*>" }
assert(lambda1 is Function1<*, *>) { "Failed: lambda1 is Function1<*, *>" }
assert(lambda0 !is Function1<*, *>) { "Failed: lambda0 !is Function1<*, *>" }
assert(lambda1 !is Function0<*>) { "Failed: lambda1 !is Function0<*>" }
assert(localFun0 is Function0<*>) { "Failed: localFun0 is Function0<*>" }
assert(localFun1 is Function1<*, *>) { "Failed: localFun1 is Function1<*, *>" }
assert(localFun0 !is Function1<*, *>) { "Failed: localFun0 !is Function1<*, *>" }
assert(localFun1 !is Function0<*>) { "Failed: localFun1 !is Function0<*>" }
assert(ef is Function1<*, *>) { "Failed: ef is Function1<*, *>" }
assert(epg is Function1<*, *>) { "Failed: epg is Function1<*, *>"}
assert(eps is Function2<*, *, *>) { "Failed: eps is Function2<*, *, *>"}
assert(afoo is Function1<*, *>) { "afoo is Function1<*, *>" }
return "OK"
}
@@ -0,0 +1,273 @@
// This is a big, ugly, semi-auto generated test.
// Use corresponding 'Small' test for debug.
import kotlin.test.*
fun fn0() {}
fun fn1(x0: Any) {}
fun fn2(x0: Any, x1: Any) {}
fun fn3(x0: Any, x1: Any, x2: Any) {}
fun fn4(x0: Any, x1: Any, x2: Any, x3: Any) {}
fun fn5(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any) {}
fun fn6(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any) {}
fun fn7(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any) {}
fun fn8(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any) {}
fun fn9(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any) {}
fun fn10(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any) {}
fun fn11(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any) {}
fun fn12(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any) {}
fun fn13(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any) {}
fun fn14(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any) {}
fun fn15(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any) {}
fun fn16(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any) {}
fun fn17(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any) {}
fun fn18(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any, x17: Any) {}
fun fn19(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any, x17: Any, x18: Any) {}
fun fn20(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any, x17: Any, x18: Any, x19: Any) {}
fun fn21(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any, x17: Any, x18: Any, x19: Any, x20: Any) {}
fun fn22(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any, x17: Any, x18: Any, x19: Any, x20: Any, x21: Any) {}
val fns = arrayOf<Any>(::fn0, ::fn1, ::fn2, ::fn3, ::fn4, ::fn5, ::fn6, ::fn7, ::fn8, ::fn9,
::fn10, ::fn11, ::fn12, ::fn13, ::fn14, ::fn15, ::fn16, ::fn17, ::fn18, ::fn19,
::fn20, ::fn21, ::fn22)
inline fun <reified T> reifiedAsSucceeds(x: Any, operation: String) {
x as T
}
inline fun <reified T> reifiedAsFailsWithCCE(x: Any, operation: String) {
assertFailsWith(ClassCastException::class.java, "$operation should throw an exception") {
x as T
}
}
interface TestFnBase {
fun testGood(x: Any)
fun testBad(x: Any)
}
object TestFn0 : TestFnBase {
override fun testGood(x: Any) =
reifiedAsSucceeds<Function0<*>>(
x, "x as Function0<*>")
override fun testBad(x: Any) =
reifiedAsFailsWithCCE<Function0<*>>(
x, "x as Function0<*>")
}
object TestFn1 : TestFnBase {
override fun testGood(x: Any) =
reifiedAsSucceeds<Function1<*, *>>(
x, "x as Function1<*, *>")
override fun testBad(x: Any) =
reifiedAsFailsWithCCE<Function1<*, *>>(
x, "x as Function1<*, *>")
}
object TestFn2 : TestFnBase {
override fun testGood(x: Any) =
reifiedAsSucceeds<Function2<*, *, *>>(
x, "x as Function2<*, *, *>")
override fun testBad(x: Any) =
reifiedAsFailsWithCCE<Function2<*, *, *>>(
x, "x as Function2<*, *, *>")
}
object TestFn3 : TestFnBase {
override fun testGood(x: Any) =
reifiedAsSucceeds<Function3<*, *, *, *>>(
x, "x as Function3<*, *, *, *>")
override fun testBad(x: Any) =
reifiedAsFailsWithCCE<Function3<*, *, *, *>>(
x, "x as Function3<*, *, *, *>")
}
object TestFn4 : TestFnBase {
override fun testGood(x: Any) =
reifiedAsSucceeds<Function4<*, *, *, *, *>>(
x, "x as Function4<*, *, *, *, *>")
override fun testBad(x: Any) =
reifiedAsFailsWithCCE<Function4<*, *, *, *, *>>(
x, "x as Function4<*, *, *, *, *>")
}
object TestFn5 : TestFnBase {
override fun testGood(x: Any) =
reifiedAsSucceeds<Function5<*, *, *, *, *, *>>(
x, "x as Function5<*, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedAsFailsWithCCE<Function5<*, *, *, *, *, *>>(
x, "x as Function5<*, *, *, *, *, *>")
}
object TestFn6 : TestFnBase {
override fun testGood(x: Any) =
reifiedAsSucceeds<Function6<*, *, *, *, *, *, *>>(
x, "x as Function6<*, *, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedAsFailsWithCCE<Function6<*, *, *, *, *, *, *>>(
x, "x as Function6<*, *, *, *, *, *, *>")
}
object TestFn7 : TestFnBase {
override fun testGood(x: Any) =
reifiedAsSucceeds<Function7<*, *, *, *, *, *, *, *>>(
x, "x as Function7<*, *, *, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedAsFailsWithCCE<Function7<*, *, *, *, *, *, *, *>>(
x, "x as Function7<*, *, *, *, *, *, *, *>")
}
object TestFn8 : TestFnBase {
override fun testGood(x: Any) =
reifiedAsSucceeds<Function8<*, *, *, *, *, *, *, *, *>>(
x, "x as Function8<*, *, *, *, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedAsFailsWithCCE<Function8<*, *, *, *, *, *, *, *, *>>(
x, "x as Function8<*, *, *, *, *, *, *, *, *>")
}
object TestFn9 : TestFnBase {
override fun testGood(x: Any) =
reifiedAsSucceeds<Function9<*, *, *, *, *, *, *, *, *, *>>(
x, "x as Function9<*, *, *, *, *, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedAsFailsWithCCE<Function9<*, *, *, *, *, *, *, *, *, *>>(
x, "x as Function9<*, *, *, *, *, *, *, *, *, *>")
}
object TestFn10 : TestFnBase {
override fun testGood(x: Any) =
reifiedAsSucceeds<Function10<*, *, *, *, *, *, *, *, *, *, *>>(
x, "x as Function10<*, *, *, *, *, *, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedAsFailsWithCCE<Function10<*, *, *, *, *, *, *, *, *, *, *>>(
x, "x as Function10<*, *, *, *, *, *, *, *, *, *, *>")
}
object TestFn11 : TestFnBase {
override fun testGood(x: Any) =
reifiedAsSucceeds<Function11<*, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as Function11<*, *, *, *, *, *, *, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedAsFailsWithCCE<Function11<*, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as Function11<*, *, *, *, *, *, *, *, *, *, *, *>")
}
object TestFn12 : TestFnBase {
override fun testGood(x: Any) =
reifiedAsSucceeds<Function12<*, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as Function12<*, *, *, *, *, *, *, *, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedAsFailsWithCCE<Function12<*, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as Function12<*, *, *, *, *, *, *, *, *, *, *, *, *>")
}
object TestFn13 : TestFnBase {
override fun testGood(x: Any) =
reifiedAsSucceeds<Function13<*, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as Function13<*, *, *, *, *, *, *, *, *, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedAsFailsWithCCE<Function13<*, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as Function13<*, *, *, *, *, *, *, *, *, *, *, *, *, *>")
}
object TestFn14 : TestFnBase {
override fun testGood(x: Any) =
reifiedAsSucceeds<Function14<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as Function14<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedAsFailsWithCCE<Function14<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as Function14<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
}
object TestFn15 : TestFnBase {
override fun testGood(x: Any) =
reifiedAsSucceeds<Function15<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as Function15<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedAsFailsWithCCE<Function15<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as Function15<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
}
object TestFn16 : TestFnBase {
override fun testGood(x: Any) =
reifiedAsSucceeds<Function16<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as Function16<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedAsFailsWithCCE<Function16<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as Function16<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
}
object TestFn17 : TestFnBase {
override fun testGood(x: Any) =
reifiedAsSucceeds<Function17<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as Function17<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedAsFailsWithCCE<Function17<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as Function17<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
}
object TestFn18 : TestFnBase {
override fun testGood(x: Any) =
reifiedAsSucceeds<Function18<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as Function18<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedAsFailsWithCCE<Function18<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as Function18<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
}
object TestFn19 : TestFnBase {
override fun testGood(x: Any) =
reifiedAsSucceeds<Function19<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as Function19<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedAsFailsWithCCE<Function19<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as Function19<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
}
object TestFn20 : TestFnBase {
override fun testGood(x: Any) =
reifiedAsSucceeds<Function20<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as Function20<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedAsFailsWithCCE<Function20<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as Function20<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
}
object TestFn21 : TestFnBase {
override fun testGood(x: Any) =
reifiedAsSucceeds<Function21<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as Function21<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedAsFailsWithCCE<Function21<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as Function21<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
}
object TestFn22 : TestFnBase {
override fun testGood(x: Any) =
reifiedAsSucceeds<Function22<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as Function22<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedAsFailsWithCCE<Function22<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as Function22<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
}
val tests = arrayOf<TestFnBase>(TestFn0, TestFn1, TestFn2, TestFn3, TestFn4, TestFn5, TestFn6, TestFn7, TestFn8, TestFn9,
TestFn10, TestFn11, TestFn12, TestFn13, TestFn14, TestFn15, TestFn16, TestFn17, TestFn18, TestFn19,
TestFn20, TestFn21, TestFn22)
fun box(): String {
for (fnI in 0 .. 22) {
for (testI in 0 .. 22) {
if (fnI == testI) {
tests[testI].testGood(fns[fnI])
}
else {
tests[testI].testBad(fns[fnI])
}
}
}
return "OK"
}
@@ -0,0 +1,36 @@
fun fn0() {}
fun fn1(x: Any) {}
inline fun <reified T> reifiedAsSucceeds(x: Any, operation: String) {
try {
x as T
}
catch (e: Throwable) {
throw AssertionError("$operation: should not throw exceptions, got $e")
}
}
inline fun <reified T> reifiedAsFailsWithCCE(x: Any, operation: String) {
try {
x as T
}
catch (e: java.lang.ClassCastException) {
return
}
catch (e: Throwable) {
throw AssertionError("$operation: should throw ClassCastException, got $e")
}
throw AssertionError("$operation: should fail with CCE, no exception thrown")
}
fun box(): String {
val f0 = ::fn0 as Any
val f1 = ::fn1 as Any
reifiedAsSucceeds<Function0<*>>(f0, "f0 as Function0<*>")
reifiedAsFailsWithCCE<Function1<*, *>>(f0, "f0 as Function1<*, *>")
reifiedAsFailsWithCCE<Function0<*>>(f1, "f1 as Function0<*>")
reifiedAsSucceeds<Function1<*, *>>(f1, "f1 as Function1<*, *>")
return "OK"
}
@@ -0,0 +1,191 @@
// This is a big, ugly, semi-auto generated test.
// Use corresponding 'Small' test for debug.
fun fn0() {}
fun fn1(x0: Any) {}
fun fn2(x0: Any, x1: Any) {}
fun fn3(x0: Any, x1: Any, x2: Any) {}
fun fn4(x0: Any, x1: Any, x2: Any, x3: Any) {}
fun fn5(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any) {}
fun fn6(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any) {}
fun fn7(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any) {}
fun fn8(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any) {}
fun fn9(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any) {}
fun fn10(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any) {}
fun fn11(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any) {}
fun fn12(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any) {}
fun fn13(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any) {}
fun fn14(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any) {}
fun fn15(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any) {}
fun fn16(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any) {}
fun fn17(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any) {}
fun fn18(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any, x17: Any) {}
fun fn19(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any, x17: Any, x18: Any) {}
fun fn20(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any, x17: Any, x18: Any, x19: Any) {}
fun fn21(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any, x17: Any, x18: Any, x19: Any, x20: Any) {}
fun fn22(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any, x17: Any, x18: Any, x19: Any, x20: Any, x21: Any) {}
val fns = arrayOf<Any>(::fn0, ::fn1, ::fn2, ::fn3, ::fn4, ::fn5, ::fn6, ::fn7, ::fn8, ::fn9,
::fn10, ::fn11, ::fn12, ::fn13, ::fn14, ::fn15, ::fn16, ::fn17, ::fn18, ::fn19,
::fn20, ::fn21, ::fn22)
inline fun <reified T> assertReifiedIs(x: Any, type: String) {
val answer: Boolean
try {
answer = x is T
}
catch (e: Throwable) {
throw AssertionError("$x is $type: should not throw exceptions, got $e")
}
assert(answer) { "$x is $type: failed" }
}
inline fun <reified T> assertReifiedIsNot(x: Any, type: String) {
val answer: Boolean
try {
answer = x !is T
}
catch (e: Throwable) {
throw AssertionError("$x !is $type: should not throw exceptions, got $e")
}
assert(answer) { "$x !is $type: failed" }
}
abstract class TestFnBase(val type: String) {
abstract fun testGood(x: Any)
abstract fun testBad(x: Any)
}
object TestFn0 : TestFnBase("Function0<*>") {
override fun testGood(x: Any) { assertReifiedIs<Function0<*>>(x, type) }
override fun testBad(x: Any) { assertReifiedIsNot<Function0<*>>(x, type) }
}
object TestFn1 : TestFnBase("Function1<*, *>") {
override fun testGood(x: Any) { assertReifiedIs<Function1<*, *>>(x, type) }
override fun testBad(x: Any) { assertReifiedIsNot<Function1<*, *>>(x, type) }
}
object TestFn2 : TestFnBase("Function2<*, *, *>") {
override fun testGood(x: Any) { assertReifiedIs<Function2<*, *, *>>(x, type) }
override fun testBad(x: Any) { assertReifiedIsNot<Function2<*, *, *>>(x, type) }
}
object TestFn3 : TestFnBase("Function3<*, *, *, *>") {
override fun testGood(x: Any) { assertReifiedIs<Function3<*, *, *, *>>(x, type) }
override fun testBad(x: Any) { assertReifiedIsNot<Function3<*, *, *, *>>(x, type) }
}
object TestFn4 : TestFnBase("Function4<*, *, *, *, *>") {
override fun testGood(x: Any) { assertReifiedIs<Function4<*, *, *, *, *>>(x, type) }
override fun testBad(x: Any) { assertReifiedIsNot<Function4<*, *, *, *, *>>(x, type) }
}
object TestFn5 : TestFnBase("Function5<*, *, *, *, *, *>") {
override fun testGood(x: Any) { assertReifiedIs<Function5<*, *, *, *, *, *>>(x, type) }
override fun testBad(x: Any) { assertReifiedIsNot<Function5<*, *, *, *, *, *>>(x, type) }
}
object TestFn6 : TestFnBase("Function6<*, *, *, *, *, *, *>") {
override fun testGood(x: Any) { assertReifiedIs<Function6<*, *, *, *, *, *, *>>(x, type) }
override fun testBad(x: Any) { assertReifiedIsNot<Function6<*, *, *, *, *, *, *>>(x, type) }
}
object TestFn7 : TestFnBase("Function7<*, *, *, *, *, *, *, *>") {
override fun testGood(x: Any) { assertReifiedIs<Function7<*, *, *, *, *, *, *, *>>(x, type) }
override fun testBad(x: Any) { assertReifiedIsNot<Function7<*, *, *, *, *, *, *, *>>(x, type) }
}
object TestFn8 : TestFnBase("Function8<*, *, *, *, *, *, *, *, *>") {
override fun testGood(x: Any) { assertReifiedIs<Function8<*, *, *, *, *, *, *, *, *>>(x, type) }
override fun testBad(x: Any) { assertReifiedIsNot<Function8<*, *, *, *, *, *, *, *, *>>(x, type) }
}
object TestFn9 : TestFnBase("Function9<*, *, *, *, *, *, *, *, *, *>") {
override fun testGood(x: Any) { assertReifiedIs<Function9<*, *, *, *, *, *, *, *, *, *>>(x, type) }
override fun testBad(x: Any) { assertReifiedIsNot<Function9<*, *, *, *, *, *, *, *, *, *>>(x, type) }
}
object TestFn10 : TestFnBase("Function10<*, *, *, *, *, *, *, *, *, *, *>") {
override fun testGood(x: Any) { assertReifiedIs<Function10<*, *, *, *, *, *, *, *, *, *, *>>(x, type) }
override fun testBad(x: Any) { assertReifiedIsNot<Function10<*, *, *, *, *, *, *, *, *, *, *>>(x, type) }
}
object TestFn11 : TestFnBase("Function11<*, *, *, *, *, *, *, *, *, *, *, *>") {
override fun testGood(x: Any) { assertReifiedIs<Function11<*, *, *, *, *, *, *, *, *, *, *, *>>(x, type) }
override fun testBad(x: Any) { assertReifiedIsNot<Function11<*, *, *, *, *, *, *, *, *, *, *, *>>(x, type) }
}
object TestFn12 : TestFnBase("Function12<*, *, *, *, *, *, *, *, *, *, *, *, *>") {
override fun testGood(x: Any) { assertReifiedIs<Function12<*, *, *, *, *, *, *, *, *, *, *, *, *>>(x, type) }
override fun testBad(x: Any) { assertReifiedIsNot<Function12<*, *, *, *, *, *, *, *, *, *, *, *, *>>(x, type) }
}
object TestFn13 : TestFnBase("Function13<*, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
override fun testGood(x: Any) { assertReifiedIs<Function13<*, *, *, *, *, *, *, *, *, *, *, *, *, *>>(x, type) }
override fun testBad(x: Any) { assertReifiedIsNot<Function13<*, *, *, *, *, *, *, *, *, *, *, *, *, *>>(x, type) }
}
object TestFn14 : TestFnBase("Function14<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
override fun testGood(x: Any) { assertReifiedIs<Function14<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(x, type) }
override fun testBad(x: Any) { assertReifiedIsNot<Function14<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(x, type) }
}
object TestFn15 : TestFnBase("Function15<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
override fun testGood(x: Any) { assertReifiedIs<Function15<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(x, type) }
override fun testBad(x: Any) { assertReifiedIsNot<Function15<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(x, type) }
}
object TestFn16 : TestFnBase("Function16<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
override fun testGood(x: Any) { assertReifiedIs<Function16<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(x, type) }
override fun testBad(x: Any) { assertReifiedIsNot<Function16<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(x, type) }
}
object TestFn17 : TestFnBase("Function17<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
override fun testGood(x: Any) { assertReifiedIs<Function17<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(x, type) }
override fun testBad(x: Any) { assertReifiedIsNot<Function17<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(x, type) }
}
object TestFn18 : TestFnBase("Function18<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
override fun testGood(x: Any) { assertReifiedIs<Function18<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(x, type) }
override fun testBad(x: Any) { assertReifiedIsNot<Function18<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(x, type) }
}
object TestFn19 : TestFnBase("Function19<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
override fun testGood(x: Any) { assertReifiedIs<Function19<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(x, type) }
override fun testBad(x: Any) { assertReifiedIsNot<Function19<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(x, type) }
}
object TestFn20 : TestFnBase("Function20<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
override fun testGood(x: Any) { assertReifiedIs<Function20<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(x, type) }
override fun testBad(x: Any) { assertReifiedIsNot<Function20<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(x, type) }
}
object TestFn21 : TestFnBase("Function21<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
override fun testGood(x: Any) { assertReifiedIs<Function21<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(x, type) }
override fun testBad(x: Any) { assertReifiedIsNot<Function21<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(x, type) }
}
object TestFn22 : TestFnBase("Function22<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
override fun testGood(x: Any) { assertReifiedIs<Function22<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(x, type) }
override fun testBad(x: Any) { assertReifiedIsNot<Function22<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(x, type) }
}
val tests = arrayOf<TestFnBase>(TestFn0, TestFn1, TestFn2, TestFn3, TestFn4, TestFn5, TestFn6, TestFn7, TestFn8, TestFn9,
TestFn10, TestFn11, TestFn12, TestFn13, TestFn14, TestFn15, TestFn16, TestFn17, TestFn18, TestFn19,
TestFn20, TestFn21, TestFn22)
fun box(): String {
for (fnI in 0 .. 22) {
for (testI in 0 .. 22) {
if (fnI == testI) {
tests[testI].testGood(fns[fnI])
}
else {
tests[testI].testBad(fns[fnI])
}
}
}
return "OK"
}
@@ -0,0 +1,36 @@
fun fn0() {}
fun fn1(x: Any) {}
inline fun <reified T> assertReifiedIs(x: Any, type: String) {
val answer: Boolean
try {
answer = x is T
}
catch (e: Throwable) {
throw AssertionError("$x is $type: should not throw exceptions, got $e")
}
assert(answer) { "$x is $type: failed" }
}
inline fun <reified T> assertReifiedIsNot(x: Any, type: String) {
val answer: Boolean
try {
answer = x !is T
}
catch (e: Throwable) {
throw AssertionError("$x !is $type: should not throw exceptions, got $e")
}
assert(answer) { "$x !is $type: failed" }
}
fun box(): String {
val f0 = ::fn0 as Any
val f1 = ::fn1 as Any
assertReifiedIs<Function0<*>>(f0, "Function0<*>")
assertReifiedIs<Function1<*, *>>(f1, "Function1<*, *>")
assertReifiedIsNot<Function0<*>>(f1, "Function0<*>")
assertReifiedIsNot<Function1<*, *>>(f0, "Function1<*, *>")
return "OK"
}
@@ -0,0 +1,285 @@
// This is a big, ugly, semi-auto generated test.
// Use corresponding 'Small' test for debug.
fun fn0() {}
fun fn1(x0: Any) {}
fun fn2(x0: Any, x1: Any) {}
fun fn3(x0: Any, x1: Any, x2: Any) {}
fun fn4(x0: Any, x1: Any, x2: Any, x3: Any) {}
fun fn5(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any) {}
fun fn6(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any) {}
fun fn7(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any) {}
fun fn8(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any) {}
fun fn9(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any) {}
fun fn10(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any) {}
fun fn11(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any) {}
fun fn12(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any) {}
fun fn13(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any) {}
fun fn14(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any) {}
fun fn15(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any) {}
fun fn16(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any) {}
fun fn17(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any) {}
fun fn18(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any, x17: Any) {}
fun fn19(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any, x17: Any, x18: Any) {}
fun fn20(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any, x17: Any, x18: Any, x19: Any) {}
fun fn21(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any, x17: Any, x18: Any, x19: Any, x20: Any) {}
fun fn22(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any, x17: Any, x18: Any, x19: Any, x20: Any, x21: Any) {}
val fns = arrayOf<Any>(::fn0, ::fn1, ::fn2, ::fn3, ::fn4, ::fn5, ::fn6, ::fn7, ::fn8, ::fn9,
::fn10, ::fn11, ::fn12, ::fn13, ::fn14, ::fn15, ::fn16, ::fn17, ::fn18, ::fn19,
::fn20, ::fn21, ::fn22)
inline fun <reified T> reifiedSafeAsReturnsNonNull(x: Any?, operation: String) {
val y = try {
x as? T
}
catch (e: Throwable) {
throw AssertionError("$operation: should not throw exceptions, got $e")
}
if (y == null) {
throw AssertionError("$operation: should return non-null, got null")
}
}
inline fun <reified T> reifiedSafeAsReturnsNull(x: Any?, operation: String) {
val y = try {
x as? T
}
catch (e: Throwable) {
throw AssertionError("$operation: should not throw exceptions, got $e")
}
if (y != null) {
throw AssertionError("$operation: should return null, got $y")
}
}
interface TestFnBase {
fun testGood(x: Any)
fun testBad(x: Any)
}
object TestFn0 : TestFnBase {
override fun testGood(x: Any) =
reifiedSafeAsReturnsNonNull<Function0<*>>(
x, "x as? Function0<*>")
override fun testBad(x: Any) =
reifiedSafeAsReturnsNull<Function0<*>>(
x, "x as? Function0<*>")
}
object TestFn1 : TestFnBase {
override fun testGood(x: Any) =
reifiedSafeAsReturnsNonNull<Function1<*, *>>(
x, "x as? Function1<*, *>")
override fun testBad(x: Any) =
reifiedSafeAsReturnsNull<Function1<*, *>>(
x, "x as? Function1<*, *>")
}
object TestFn2 : TestFnBase {
override fun testGood(x: Any) =
reifiedSafeAsReturnsNonNull<Function2<*, *, *>>(
x, "x as? Function2<*, *, *>")
override fun testBad(x: Any) =
reifiedSafeAsReturnsNull<Function2<*, *, *>>(
x, "x as? Function2<*, *, *>")
}
object TestFn3 : TestFnBase {
override fun testGood(x: Any) =
reifiedSafeAsReturnsNonNull<Function3<*, *, *, *>>(
x, "x as? Function3<*, *, *, *>")
override fun testBad(x: Any) =
reifiedSafeAsReturnsNull<Function3<*, *, *, *>>(
x, "x as? Function3<*, *, *, *>")
}
object TestFn4 : TestFnBase {
override fun testGood(x: Any) =
reifiedSafeAsReturnsNonNull<Function4<*, *, *, *, *>>(
x, "x as? Function4<*, *, *, *, *>")
override fun testBad(x: Any) =
reifiedSafeAsReturnsNull<Function4<*, *, *, *, *>>(
x, "x as? Function4<*, *, *, *, *>")
}
object TestFn5 : TestFnBase {
override fun testGood(x: Any) =
reifiedSafeAsReturnsNonNull<Function5<*, *, *, *, *, *>>(
x, "x as? Function5<*, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedSafeAsReturnsNull<Function5<*, *, *, *, *, *>>(
x, "x as? Function5<*, *, *, *, *, *>")
}
object TestFn6 : TestFnBase {
override fun testGood(x: Any) =
reifiedSafeAsReturnsNonNull<Function6<*, *, *, *, *, *, *>>(
x, "x as? Function6<*, *, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedSafeAsReturnsNull<Function6<*, *, *, *, *, *, *>>(
x, "x as? Function6<*, *, *, *, *, *, *>")
}
object TestFn7 : TestFnBase {
override fun testGood(x: Any) =
reifiedSafeAsReturnsNonNull<Function7<*, *, *, *, *, *, *, *>>(
x, "x as? Function7<*, *, *, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedSafeAsReturnsNull<Function7<*, *, *, *, *, *, *, *>>(
x, "x as? Function7<*, *, *, *, *, *, *, *>")
}
object TestFn8 : TestFnBase {
override fun testGood(x: Any) =
reifiedSafeAsReturnsNonNull<Function8<*, *, *, *, *, *, *, *, *>>(
x, "x as? Function8<*, *, *, *, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedSafeAsReturnsNull<Function8<*, *, *, *, *, *, *, *, *>>(
x, "x as? Function8<*, *, *, *, *, *, *, *, *>")
}
object TestFn9 : TestFnBase {
override fun testGood(x: Any) =
reifiedSafeAsReturnsNonNull<Function9<*, *, *, *, *, *, *, *, *, *>>(
x, "x as? Function9<*, *, *, *, *, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedSafeAsReturnsNull<Function9<*, *, *, *, *, *, *, *, *, *>>(
x, "x as? Function9<*, *, *, *, *, *, *, *, *, *>")
}
object TestFn10 : TestFnBase {
override fun testGood(x: Any) =
reifiedSafeAsReturnsNonNull<Function10<*, *, *, *, *, *, *, *, *, *, *>>(
x, "x as? Function10<*, *, *, *, *, *, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedSafeAsReturnsNull<Function10<*, *, *, *, *, *, *, *, *, *, *>>(
x, "x as? Function10<*, *, *, *, *, *, *, *, *, *, *>")
}
object TestFn11 : TestFnBase {
override fun testGood(x: Any) =
reifiedSafeAsReturnsNonNull<Function11<*, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as? Function11<*, *, *, *, *, *, *, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedSafeAsReturnsNull<Function11<*, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as? Function11<*, *, *, *, *, *, *, *, *, *, *, *>")
}
object TestFn12 : TestFnBase {
override fun testGood(x: Any) =
reifiedSafeAsReturnsNonNull<Function12<*, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as? Function12<*, *, *, *, *, *, *, *, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedSafeAsReturnsNull<Function12<*, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as? Function12<*, *, *, *, *, *, *, *, *, *, *, *, *>")
}
object TestFn13 : TestFnBase {
override fun testGood(x: Any) =
reifiedSafeAsReturnsNonNull<Function13<*, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as? Function13<*, *, *, *, *, *, *, *, *, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedSafeAsReturnsNull<Function13<*, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as? Function13<*, *, *, *, *, *, *, *, *, *, *, *, *, *>")
}
object TestFn14 : TestFnBase {
override fun testGood(x: Any) =
reifiedSafeAsReturnsNonNull<Function14<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as? Function14<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedSafeAsReturnsNull<Function14<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as? Function14<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
}
object TestFn15 : TestFnBase {
override fun testGood(x: Any) =
reifiedSafeAsReturnsNonNull<Function15<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as? Function15<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedSafeAsReturnsNull<Function15<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as? Function15<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
}
object TestFn16 : TestFnBase {
override fun testGood(x: Any) =
reifiedSafeAsReturnsNonNull<Function16<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as? Function16<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedSafeAsReturnsNull<Function16<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as? Function16<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
}
object TestFn17 : TestFnBase {
override fun testGood(x: Any) =
reifiedSafeAsReturnsNonNull<Function17<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as? Function17<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedSafeAsReturnsNull<Function17<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as? Function17<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
}
object TestFn18 : TestFnBase {
override fun testGood(x: Any) =
reifiedSafeAsReturnsNonNull<Function18<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as? Function18<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedSafeAsReturnsNull<Function18<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as? Function18<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
}
object TestFn19 : TestFnBase {
override fun testGood(x: Any) =
reifiedSafeAsReturnsNonNull<Function19<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as? Function19<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedSafeAsReturnsNull<Function19<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as? Function19<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
}
object TestFn20 : TestFnBase {
override fun testGood(x: Any) =
reifiedSafeAsReturnsNonNull<Function20<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as? Function20<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedSafeAsReturnsNull<Function20<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as? Function20<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
}
object TestFn21 : TestFnBase {
override fun testGood(x: Any) =
reifiedSafeAsReturnsNonNull<Function21<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as? Function21<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedSafeAsReturnsNull<Function21<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as? Function21<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
}
object TestFn22 : TestFnBase {
override fun testGood(x: Any) =
reifiedSafeAsReturnsNonNull<Function22<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as? Function22<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
override fun testBad(x: Any) =
reifiedSafeAsReturnsNull<Function22<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>>(
x, "x as? Function22<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>")
}
val tests = arrayOf<TestFnBase>(TestFn0, TestFn1, TestFn2, TestFn3, TestFn4, TestFn5, TestFn6, TestFn7, TestFn8, TestFn9,
TestFn10, TestFn11, TestFn12, TestFn13, TestFn14, TestFn15, TestFn16, TestFn17, TestFn18, TestFn19,
TestFn20, TestFn21, TestFn22)
fun box(): String {
for (fnI in 0 .. 22) {
for (testI in 0 .. 22) {
if (fnI == testI) {
tests[testI].testGood(fns[fnI])
}
else {
tests[testI].testBad(fns[fnI])
}
}
}
return "OK"
}
@@ -0,0 +1,41 @@
fun fn0() {}
fun fn1(x: Any) {}
inline fun <reified T> reifiedSafeAsReturnsNonNull(x: Any?, operation: String) {
val y = try {
x as? T
}
catch (e: Throwable) {
throw AssertionError("$operation: should not throw exceptions, got $e")
}
if (y == null) {
throw AssertionError("$operation: should return non-null, got null")
}
}
inline fun <reified T> reifiedSafeAsReturnsNull(x: Any?, operation: String) {
val y = try {
x as? T
}
catch (e: Throwable) {
throw AssertionError("$operation: should not throw exceptions, got $e")
}
if (y != null) {
throw AssertionError("$operation: should return null, got $y")
}
}
fun box(): String {
val f0 = ::fn0 as Any
val f1 = ::fn1 as Any
reifiedSafeAsReturnsNonNull<Function0<*>>(f0, "f0 as Function0<*>")
reifiedSafeAsReturnsNull<Function1<*, *>>(f0, "f0 as Function1<*, *>")
reifiedSafeAsReturnsNull<Function0<*>>(f1, "f1 as Function0<*>")
reifiedSafeAsReturnsNonNull<Function1<*, *>>(f1, "f1 as Function1<*, *>")
reifiedSafeAsReturnsNull<Function0<*>>(null, "null as Function0<*>")
reifiedSafeAsReturnsNull<Function1<*, *>>(null, "null as Function1<*, *>")
return "OK"
}
@@ -0,0 +1,327 @@
// This is a big, ugly, semi-auto generated test.
// Use corresponding 'Small' test for debug.
fun fn0() {}
fun fn1(x0: Any) {}
fun fn2(x0: Any, x1: Any) {}
fun fn3(x0: Any, x1: Any, x2: Any) {}
fun fn4(x0: Any, x1: Any, x2: Any, x3: Any) {}
fun fn5(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any) {}
fun fn6(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any) {}
fun fn7(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any) {}
fun fn8(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any) {}
fun fn9(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any) {}
fun fn10(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any) {}
fun fn11(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any) {}
fun fn12(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any) {}
fun fn13(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any) {}
fun fn14(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any) {}
fun fn15(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any) {}
fun fn16(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any) {}
fun fn17(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any) {}
fun fn18(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any, x17: Any) {}
fun fn19(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any, x17: Any, x18: Any) {}
fun fn20(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any, x17: Any, x18: Any, x19: Any) {}
fun fn21(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any, x17: Any, x18: Any, x19: Any, x20: Any) {}
fun fn22(x0: Any, x1: Any, x2: Any, x3: Any, x4: Any, x5: Any, x6: Any, x7: Any, x8: Any, x9: Any, x10: Any, x11: Any, x12: Any, x13: Any, x14: Any, x15: Any, x16: Any, x17: Any, x18: Any, x19: Any, x20: Any, x21: Any) {}
val fns = arrayOf<Any>(::fn0, ::fn1, ::fn2, ::fn3, ::fn4, ::fn5, ::fn6, ::fn7, ::fn8, ::fn9,
::fn10, ::fn11, ::fn12, ::fn13, ::fn14, ::fn15, ::fn16, ::fn17, ::fn18, ::fn19,
::fn20, ::fn21, ::fn22)
inline fun safeAsReturnsNull(operation: String, cast: () -> Any?) {
try {
val x = cast()
assert(x == null) { "$operation: should return null, got $x" }
}
catch (e: Throwable) {
throw AssertionError("$operation: should not throw exceptions, got $e")
}
}
inline fun safeAsReturnsNonNull(operation: String, cast: () -> Any?) {
try {
val x = cast()
assert(x != null) { "$operation: should return non-null" }
}
catch (e: Throwable) {
throw AssertionError("$operation: should not throw exceptions, got $e")
}
}
interface TestFnBase {
abstract fun testGood(x: Any)
abstract fun testBad(x: Any)
}
object TestFn0 : TestFnBase {
override fun testGood(x: Any) =
safeAsReturnsNonNull("x as? Function0<*>") {
x as? Function0<*>
}
override fun testBad(x: Any) =
safeAsReturnsNull("x as? Function0<*>") {
x as? Function0<*>
}
}
object TestFn1 : TestFnBase {
override fun testGood(x: Any) =
safeAsReturnsNonNull("x as? Function1<*, *>") {
x as? Function1<*, *>
}
override fun testBad(x: Any) =
safeAsReturnsNull("x as? Function1<*, *>") {
x as? Function1<*, *>
}
}
object TestFn2 : TestFnBase {
override fun testGood(x: Any) =
safeAsReturnsNonNull("x as? Function2<*, *, *>") {
x as? Function2<*, *, *>
}
override fun testBad(x: Any) =
safeAsReturnsNull("x as? Function2<*, *, *>") {
x as? Function2<*, *, *>
}
}
object TestFn3 : TestFnBase {
override fun testGood(x: Any) =
safeAsReturnsNonNull("x as? Function3<*, *, *, *>") {
x as? Function3<*, *, *, *>
}
override fun testBad(x: Any) =
safeAsReturnsNull("x as? Function3<*, *, *, *>") {
x as? Function3<*, *, *, *>
}
}
object TestFn4 : TestFnBase {
override fun testGood(x: Any) =
safeAsReturnsNonNull("x as? Function4<*, *, *, *, *>") {
x as? Function4<*, *, *, *, *>
}
override fun testBad(x: Any) =
safeAsReturnsNull("x as? Function4<*, *, *, *, *>") {
x as? Function4<*, *, *, *, *>
}
}
object TestFn5 : TestFnBase {
override fun testGood(x: Any) =
safeAsReturnsNonNull("x as? Function5<*, *, *, *, *, *>") {
x as? Function5<*, *, *, *, *, *>
}
override fun testBad(x: Any) =
safeAsReturnsNull("x as? Function5<*, *, *, *, *, *>") {
x as? Function5<*, *, *, *, *, *>
}
}
object TestFn6 : TestFnBase {
override fun testGood(x: Any) =
safeAsReturnsNonNull("x as? Function6<*, *, *, *, *, *, *>") {
x as? Function6<*, *, *, *, *, *, *>
}
override fun testBad(x: Any) =
safeAsReturnsNull("x as? Function6<*, *, *, *, *, *, *>") {
x as? Function6<*, *, *, *, *, *, *>
}
}
object TestFn7 : TestFnBase {
override fun testGood(x: Any) =
safeAsReturnsNonNull("x as? Function7<*, *, *, *, *, *, *, *>") {
x as? Function7<*, *, *, *, *, *, *, *>
}
override fun testBad(x: Any) =
safeAsReturnsNull("x as? Function7<*, *, *, *, *, *, *, *>") {
x as? Function7<*, *, *, *, *, *, *, *>
}
}
object TestFn8 : TestFnBase {
override fun testGood(x: Any) =
safeAsReturnsNonNull("x as? Function8<*, *, *, *, *, *, *, *, *>") {
x as? Function8<*, *, *, *, *, *, *, *, *>
}
override fun testBad(x: Any) =
safeAsReturnsNull("x as? Function8<*, *, *, *, *, *, *, *, *>") {
x as? Function8<*, *, *, *, *, *, *, *, *>
}
}
object TestFn9 : TestFnBase {
override fun testGood(x: Any) =
safeAsReturnsNonNull("x as? Function9<*, *, *, *, *, *, *, *, *, *>") {
x as? Function9<*, *, *, *, *, *, *, *, *, *>
}
override fun testBad(x: Any) =
safeAsReturnsNull("x as? Function9<*, *, *, *, *, *, *, *, *, *>") {
x as? Function9<*, *, *, *, *, *, *, *, *, *>
}
}
object TestFn10 : TestFnBase {
override fun testGood(x: Any) =
safeAsReturnsNonNull("x as? Function10<*, *, *, *, *, *, *, *, *, *, *>") {
x as? Function10<*, *, *, *, *, *, *, *, *, *, *>
}
override fun testBad(x: Any) =
safeAsReturnsNull("x as? Function10<*, *, *, *, *, *, *, *, *, *, *>") {
x as? Function10<*, *, *, *, *, *, *, *, *, *, *>
}
}
object TestFn11 : TestFnBase {
override fun testGood(x: Any) =
safeAsReturnsNonNull("x as? Function11<*, *, *, *, *, *, *, *, *, *, *, *>") {
x as? Function11<*, *, *, *, *, *, *, *, *, *, *, *>
}
override fun testBad(x: Any) =
safeAsReturnsNull("x as? Function11<*, *, *, *, *, *, *, *, *, *, *, *>") {
x as? Function11<*, *, *, *, *, *, *, *, *, *, *, *>
}
}
object TestFn12 : TestFnBase {
override fun testGood(x: Any) =
safeAsReturnsNonNull("x as? Function12<*, *, *, *, *, *, *, *, *, *, *, *, *>") {
x as? Function12<*, *, *, *, *, *, *, *, *, *, *, *, *>
}
override fun testBad(x: Any) =
safeAsReturnsNull("x as? Function12<*, *, *, *, *, *, *, *, *, *, *, *, *>") {
x as? Function12<*, *, *, *, *, *, *, *, *, *, *, *, *>
}
}
object TestFn13 : TestFnBase {
override fun testGood(x: Any) =
safeAsReturnsNonNull("x as? Function13<*, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
x as? Function13<*, *, *, *, *, *, *, *, *, *, *, *, *, *>
}
override fun testBad(x: Any) =
safeAsReturnsNull("x as? Function13<*, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
x as? Function13<*, *, *, *, *, *, *, *, *, *, *, *, *, *>
}
}
object TestFn14 : TestFnBase {
override fun testGood(x: Any) =
safeAsReturnsNonNull("x as? Function14<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
x as? Function14<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *>
}
override fun testBad(x: Any) =
safeAsReturnsNull("x as? Function14<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
x as? Function14<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *>
}
}
object TestFn15 : TestFnBase {
override fun testGood(x: Any) =
safeAsReturnsNonNull("x as? Function15<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
x as? Function15<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>
}
override fun testBad(x: Any) =
safeAsReturnsNull("x as? Function15<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
x as? Function15<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>
}
}
object TestFn16 : TestFnBase {
override fun testGood(x: Any) =
safeAsReturnsNonNull("x as? Function16<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
x as? Function16<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>
}
override fun testBad(x: Any) =
safeAsReturnsNull("x as? Function16<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
x as? Function16<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>
}
}
object TestFn17 : TestFnBase {
override fun testGood(x: Any) =
safeAsReturnsNonNull("x as? Function17<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
x as? Function17<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>
}
override fun testBad(x: Any) =
safeAsReturnsNull("x as? Function17<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
x as? Function17<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>
}
}
object TestFn18 : TestFnBase {
override fun testGood(x: Any) =
safeAsReturnsNonNull("x as? Function18<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
x as? Function18<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>
}
override fun testBad(x: Any) =
safeAsReturnsNull("x as? Function18<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
x as? Function18<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>
}
}
object TestFn19 : TestFnBase {
override fun testGood(x: Any) =
safeAsReturnsNonNull("x as? Function19<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
x as? Function19<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>
}
override fun testBad(x: Any) =
safeAsReturnsNull("x as? Function19<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
x as? Function19<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>
}
}
object TestFn20 : TestFnBase {
override fun testGood(x: Any) =
safeAsReturnsNonNull("x as? Function20<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
x as? Function20<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>
}
override fun testBad(x: Any) =
safeAsReturnsNull("x as? Function20<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
x as? Function20<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>
}
}
object TestFn21 : TestFnBase {
override fun testGood(x: Any) =
safeAsReturnsNonNull("x as? Function21<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
x as? Function21<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>
}
override fun testBad(x: Any) =
safeAsReturnsNull("x as? Function21<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
x as? Function21<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>
}
}
object TestFn22 : TestFnBase {
override fun testGood(x: Any) =
safeAsReturnsNonNull("x as? Function22<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
x as? Function22<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>
}
override fun testBad(x: Any) =
safeAsReturnsNull("x as? Function22<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>") {
x as? Function22<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *>
}
}
val tests = arrayOf<TestFnBase>(TestFn0, TestFn1, TestFn2, TestFn3, TestFn4, TestFn5, TestFn6, TestFn7, TestFn8, TestFn9,
TestFn10, TestFn11, TestFn12, TestFn13, TestFn14, TestFn15, TestFn16, TestFn17, TestFn18, TestFn19,
TestFn20, TestFn21, TestFn22)
fun box(): String {
for (fnI in 0 .. 22) {
for (testI in 0 .. 22) {
if (fnI == testI) {
tests[testI].testGood(fns[fnI])
}
else {
tests[testI].testBad(fns[fnI])
}
}
}
return "OK"
}
@@ -0,0 +1,34 @@
fun fn0() {}
fun fn1(x: Any) {}
inline fun safeAsReturnsNull(operation: String, cast: () -> Any?) {
try {
val x = cast()
assert(x == null) { "$operation: should return null, got $x" }
}
catch (e: Throwable) {
throw AssertionError("$operation: should not throw exceptions, got $e")
}
}
inline fun safeAsReturnsNonNull(operation: String, cast: () -> Any?) {
try {
val x = cast()
assert(x != null) { "$operation: should return non-null" }
}
catch (e: Throwable) {
throw AssertionError("$operation: should not throw exceptions, got $e")
}
}
fun box(): String {
val f0 = ::fn0 as Any
val f1 = ::fn1 as Any
safeAsReturnsNonNull("f0 as? Function0<*>") { f0 as? Function0<*> }
safeAsReturnsNull("f0 as? Function1<*, *>") { f0 as? Function1<*, *> }
safeAsReturnsNull("f1 as? Function0<*>") { f1 as? Function0<*> }
safeAsReturnsNonNull("f1 as? Function1<*, *>") { f1 as? Function1<*, *> }
return "OK"
}