// IGNORE_BACKEND_FIR: JVM_IR // KJS_WITH_FULL_RUNTIME // WITH_RUNTIME class Itr : Iterator by ArrayList().iterator() class MItr : MutableIterator by ArrayList().iterator() class LItr : ListIterator by ArrayList().listIterator() class MLItr : MutableListIterator by ArrayList().listIterator() class It : Iterable by ArrayList() class MIt : MutableIterable by ArrayList() class C : Collection by ArrayList() class MC : MutableCollection by ArrayList() class L : List by ArrayList() class ML : MutableList by ArrayList() class S : Set by HashSet() class MS : MutableSet by HashSet() class M : Map by HashMap() class MM : MutableMap by HashMap() class ME : Map.Entry { override val key: String get() = throw UnsupportedOperationException() override val value: String get() = throw UnsupportedOperationException() } class MME : MutableMap.MutableEntry { override val key: String get() = throw UnsupportedOperationException() override val value: String get() = throw UnsupportedOperationException() override fun setValue(value: String): String = throw UnsupportedOperationException() } inline fun reifiedIs(x: Any): Boolean = x is T inline fun reifiedIsNot(x: Any): Boolean = x !is T fun assert(condition: Boolean, message: () -> String) { if (!condition) throw AssertionError(message())} fun box(): String { val itr = Itr() as Any val mitr = MItr() assert(reifiedIsNot>(itr)) { "reifiedIsNot>(itr)" } assert(reifiedIs>(mitr)) { "reifiedIs>(mitr)" } val litr = LItr() as Any val mlitr = MLItr() assert(reifiedIsNot>(litr)) { "reifiedIsNot>(litr)" } assert(reifiedIsNot>(litr)) { "reifiedIsNot>(litr)" } assert(reifiedIs>(mlitr)) { "reifiedIs>(mlitr)" } val it = It() as Any val mit = MIt() val arrayList = ArrayList() assert(reifiedIsNot>(it)) { "reifiedIsNot>(it)" } assert(reifiedIs>(mit)) { "reifiedIs>(mit)" } assert(reifiedIs>(arrayList)) { "reifiedIs>(arrayList)" } val coll = C() as Any val mcoll = MC() assert(reifiedIsNot>(coll)) { "reifiedIsNot>(coll)" } assert(reifiedIsNot>(coll)) { "reifiedIsNot>(coll)" } assert(reifiedIs>(mcoll)) { "reifiedIs>(mcoll)" } assert(reifiedIs>(mcoll)) { "reifiedIs>(mcoll)" } assert(reifiedIs>(arrayList)) { "reifiedIs>(arrayList)" } val list = L() as Any val mlist = ML() assert(reifiedIsNot>(list)) { "reifiedIsNot>(list)" } assert(reifiedIsNot>(list)) { "reifiedIsNot>(list)" } assert(reifiedIsNot>(list)) { "reifiedIsNot>(list)" } assert(reifiedIs>(mlist)) { "reifiedIs>(mlist)" } assert(reifiedIs>(mlist)) { "reifiedIs>(mlist)" } assert(reifiedIs>(mlist)) { "reifiedIs>(mlist)" } assert(reifiedIs>(arrayList)) { "reifiedIs>(arrayList)" } val set = S() as Any val mset = MS() val hashSet = HashSet() assert(reifiedIsNot>(set)) { "reifiedIsNot>(set)" } assert(reifiedIsNot>(set)) { "reifiedIsNot>(set)" } assert(reifiedIsNot>(set)) { "reifiedIsNot>(set)" } assert(reifiedIs>(mset)) { "reifiedIs>(mset)" } assert(reifiedIs>(mset)) { "reifiedIs>(mset)" } assert(reifiedIs>(mset)) { "reifiedIs>(mset)" } assert(reifiedIs>(hashSet)) { "reifiedIs>(hashSet)" } assert(reifiedIs>(hashSet)) { "reifiedIs>(hashSet)" } assert(reifiedIs>(hashSet)) { "reifiedIs>(hashSet)" } val map = M() as Any val mmap = MM() val hashMap = HashMap() assert(reifiedIsNot>(map)) { "reifiedIsNot>(map)" } assert(reifiedIs>(mmap)) { "reifiedIs>(mmap)"} assert(reifiedIs>(hashMap)) { "reifiedIs>(hashMap)" } val entry = ME() as Any val mentry = MME() hashMap[""] = "" val hashMapEntry = hashMap.entries.first() assert(reifiedIsNot>(entry)) { "reifiedIsNot>(entry)"} assert(reifiedIs>(mentry)) { "reifiedIs>(mentry)"} assert(reifiedIs>(hashMapEntry)) { "reifiedIs>(hashMapEntry)"} return "OK" }