Files
kotlin-fork/compiler/testData/codegen/box/inlineClasses/lateinitInlineClasses.kt
T
Abduqodiri Qurbonzoda b65a68ca0d [K/N and WASM] Internalize NoWhenBranchMatchedException and UninitializedPropertyAccessException
As a part of efforts to stabilize Native stdlib.

Merge-request: KT-MR-9531
Merged-by: Abduqodiri Qurbonzoda <abduqodiri.qurbonzoda@jetbrains.com>
2023-04-10 21:10:51 +00:00

71 lines
1.8 KiB
Kotlin
Vendored

// WITH_STDLIB
// WORKS_WHEN_VALUE_CLASS
// LANGUAGE: +ValueClasses, +InlineLateinit
@file:Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER")
OPTIONAL_JVM_INLINE_ANNOTATION
value class IC1(val x: String)
lateinit var a: IC1
OPTIONAL_JVM_INLINE_ANNOTATION
value class IC2<T : Number>(val x: T)
class MyClass {
lateinit var b: IC2<Int>
fun isInit() = ::b.isInitialized
}
OPTIONAL_JVM_INLINE_ANNOTATION
value class IC3<T>(val x: Comparable<T>)
OPTIONAL_JVM_INLINE_ANNOTATION
value class IC4(val x: IC1)
lateinit var c: IC4
inline fun <reified T> assertThrows(block: () -> Unit): Boolean {
try {
block.invoke()
} catch (t: Throwable) {
return t is T
}
return false
}
fun box(): String {
if (::a.isInitialized) return "Fail 1.1"
if (!assertThrows<UninitializedPropertyAccessException> { val t = a }) return "Fail 1.2"
a = IC1("a")
if (!::a.isInitialized) return "Fail 1.3"
if (a.x != "a") return "Fail 1.4"
val inst = MyClass()
if (inst.isInit()) return "Fail 2.1"
if (!assertThrows<UninitializedPropertyAccessException> { val t = inst.b }) return "Fail 2.2"
inst.b = IC2(42)
if (!inst.isInit()) return "Fail 2.3"
if (inst.b.x != 42) return "Fail 2.4"
lateinit var z: IC3<Double>
if (!assertThrows<UninitializedPropertyAccessException> { val t = z }) return "Fail 3.1"
z = IC3(5.0)
if (z.x != 5.0) return "Fail 3.2"
if (::c.isInitialized) return "Fail 4.1"
if (!assertThrows<UninitializedPropertyAccessException> { val t = c }) return "Fail 4.2"
c = IC4(IC1("c"))
if (!::c.isInitialized) return "Fail 4.3"
if (c.x.x != "c") return "Fail 4.4"
return "OK"
}
//CHECK_BYTECODE_TEXT
// JVM_IR_TEMPLATES
// 0 INVOKESTATIC IC1.box-impl
// 0 INVOKESTATIC IC2.box-impl
// 0 INVOKESTATIC IC3.box-impl
// 0 INVOKESTATIC IC4.box-impl