[IR] Support reflection for MFVC

Signed-off-by: Evgeniy.Zhelenskiy <Evgeniy.Zhelenskiy@jetbrains.com>

#KT-1179
This commit is contained in:
Evgeniy.Zhelenskiy
2023-03-02 01:48:02 +01:00
committed by Space Team
parent 1ff4906880
commit 88f293d4a9
52 changed files with 2910 additions and 172 deletions
@@ -0,0 +1,51 @@
// TARGET_BACKEND: JVM_IR
// WITH_REFLECT
// LANGUAGE: +ValueClasses
import kotlin.test.assertEquals
@JvmInline
value class Z(val x1: UInt, val x2: Int)
class Outer(val z1: Z, val z2: Z?) {
inner class Inner(val z3: Z, val z4: Z?) {
val test = "$z1 $z2 $z3 $z4"
}
}
@JvmInline
value class ValueNonNullOuter(val z11: Z, val z12: Z) {
class Inner(val t: ValueNonNullOuter, val z2: Z, val z3: Z?) {
val test = "${t.z11} ${t.z12} $z2 $z3"
}
}
@JvmInline
value class ValueNullableOuter(val z11: Z?, val z12: Z?) {
class Inner(val t: ValueNullableOuter, val z2: Z, val z3: Z?) {
val test = "${t.z11} ${t.z12} $z2 $z3"
}
}
fun box(): String {
val z1 = Z(1U, -1)
val z2 = Z(2U, -2)
val z3 = Z(3U, -3)
val z4 = Z(4U, -4)
val outer = ::Outer.call(z1, z2)
assertEquals(z1, outer.z1)
assertEquals(z2, outer.z2)
assertEquals("Z(x1=1, x2=-1) Z(x1=2, x2=-2) Z(x1=3, x2=-3) Z(x1=4, x2=-4)", Outer::Inner.call(outer, z3, z4).test)
assertEquals("Z(x1=1, x2=-1) Z(x1=2, x2=-2) Z(x1=2, x2=-2) Z(x1=4, x2=-4)", outer::Inner.call(z2, z4).test)
val valueNonNullOuter = ValueNonNullOuter(z1, z4)
assertEquals("Z(x1=1, x2=-1) Z(x1=4, x2=-4) Z(x1=2, x2=-2) Z(x1=3, x2=-3)", ValueNonNullOuter::Inner.call(valueNonNullOuter, z2, z3).test)
val valueNullableOuter = ValueNullableOuter(z1, z4)
assertEquals("Z(x1=1, x2=-1) Z(x1=4, x2=-4) Z(x1=2, x2=-2) Z(x1=3, x2=-3)", ValueNullableOuter::Inner.call(valueNullableOuter, z2, z3).test)
return "OK"
}
@@ -0,0 +1,59 @@
// TARGET_BACKEND: JVM_IR
// WITH_REFLECT
// LANGUAGE: +ValueClasses
import kotlin.reflect.jvm.isAccessible
import kotlin.test.assertEquals
@JvmInline
value class S(val value1: UInt, val value2: Int) {
operator fun plus(other: S): S = S(this.value1 + other.value1, this.value2 + other.value2)
}
class C {
private var nonNullMember: S = S(UInt.MAX_VALUE, -10)
private var nullableMember: S? = S(UInt.MAX_VALUE, -10)
fun nonNullUnboundRef() = C::nonNullMember.apply { isAccessible = true }
fun nonNullBoundRef() = this::nonNullMember.apply { isAccessible = true }
fun nullableUnboundRef() = C::nullableMember.apply { isAccessible = true }
fun nullableBoundRef() = this::nullableMember.apply { isAccessible = true }
}
private var nonNullTopLevel: S = S(UInt.MAX_VALUE, -10)
private var nullableTopLevel: S? = S(UInt.MAX_VALUE, -10)
fun box(): String {
val c = C()
val zero = S(0U, 5)
val one = S(1U, 10)
val two = S(2U, 20)
assertEquals(Unit, c.nonNullUnboundRef().setter.call(c, zero))
assertEquals(zero, c.nonNullUnboundRef().call(c))
assertEquals(zero, c.nonNullUnboundRef().getter.call(c))
assertEquals(Unit, c.nonNullBoundRef().setter.call(one))
assertEquals(one, c.nonNullBoundRef().call())
assertEquals(one, c.nonNullBoundRef().getter.call())
assertEquals(Unit, c.nullableUnboundRef().setter.call(c, zero))
assertEquals(zero, c.nullableUnboundRef().call(c))
assertEquals(zero, c.nullableUnboundRef().getter.call(c))
assertEquals(Unit, c.nullableBoundRef().setter.call(one))
assertEquals(one, c.nullableBoundRef().call())
assertEquals(one, c.nullableBoundRef().getter.call())
val nonNullTopLevel = ::nonNullTopLevel.apply { isAccessible = true }
assertEquals(Unit, nonNullTopLevel.setter.call(two))
assertEquals(two, nonNullTopLevel.call())
assertEquals(two, nonNullTopLevel.getter.call())
val nullableTopLevel = ::nullableTopLevel.apply { isAccessible = true }
assertEquals(Unit, nullableTopLevel.setter.call(two))
assertEquals(two, nullableTopLevel.call())
assertEquals(two, nullableTopLevel.getter.call())
return "OK"
}
@@ -0,0 +1,53 @@
// TARGET_BACKEND: JVM_IR
// WITH_REFLECT
// LANGUAGE: +ValueClasses
import kotlin.test.assertEquals
@JvmInline
value class S(val value1: UInt, val value2: Int) {
operator fun plus(other: S): S = S(this.value1 + other.value1, this.value2 + other.value2)
}
class C {
fun member(x: S, y1: UInt, y2: Int, z: S?): S = x + S(y1, y2) + z!!
}
fun topLevel(x1: UInt, x2: Int, y: S, z: S?): S = S(x1, x2) + y + z!!
fun S.extension1(y: S, z: S?): S = this + y + z!!
fun S?.extension2(y: S, z: S?) = this!! + y + z!!
fun S.extension3_1(): UInt = value1
fun S.extension3_2(): Int = value2
fun S?.extension4_1(): UInt = this!!.value1
fun S?.extension4_2(): Int = this!!.value2
fun box(): String {
val zero = S(0U, 1000)
val one = S(1U, -1)
val two = S(2U, -2)
val four = S(4U, -4)
val seven = S(7U, -7)
assertEquals(seven, C::member.call(C(), one, 2U, -2, four))
assertEquals(seven, ::topLevel.call(1U, -1, two, four))
assertEquals(seven, S::extension1.call(one, two, four))
assertEquals(seven, S::extension2.call(one, two, four))
assertEquals(0U, S::extension3_1.call(zero))
assertEquals(1000, S::extension3_2.call(zero))
assertEquals(0U, S?::extension4_1.call(zero))
assertEquals(1000, S?::extension4_2.call(zero))
assertEquals(seven, C()::member.call(one, 2U, -2, four))
assertEquals(seven, one::extension1.call(two, four))
assertEquals(seven, one::extension2.call(two, four))
assertEquals(0U, zero::extension3_1.call())
assertEquals(1000, zero::extension3_2.call())
assertEquals(0U, zero::extension4_1.call())
assertEquals(1000, zero::extension4_2.call())
return "OK"
}
@@ -0,0 +1,74 @@
// TARGET_BACKEND: JVM_IR
// WITH_REFLECT
// LANGUAGE: +ValueClasses
import kotlin.test.assertEquals
@JvmInline
value class Z(internal val x1: UInt, internal val x2: Int)
@JvmInline
value class Z2(internal val x1: Z, internal val x2: Z)
@JvmInline
value class L(internal val x1: ULong, internal val x2: Long)
@JvmInline
value class L2(internal val x1: L, internal val x2: L)
@JvmInline
value class A1(internal val x1: Any?, internal val x2: Any?)
@JvmInline
value class A1_2(internal val x1: A1, internal val x2: A1)
@JvmInline
value class A2(internal val x1: Any, internal val x2: Any)
@JvmInline
value class A2_2(internal val x1: A2, internal val x2: A2)
fun box(): String {
assertEquals(42U, Z::x1.call(Z(42U, 43)))
assertEquals(43, Z::x2.call(Z(42U, 43)))
assertEquals(42U, Z(42U, 43)::x1.call())
assertEquals(43, Z(42U, 43)::x2.call())
assertEquals(1234UL, L::x1.call(L(1234UL, 5678L)))
assertEquals(5678L, L::x2.call(L(1234UL, 5678L)))
assertEquals(1234UL, L(1234UL, 5678L)::x1.call())
assertEquals(5678L, L(1234UL, 5678L)::x2.call())
assertEquals("abc", A1::x1.call(A1("abc", "def")))
assertEquals("def", A1::x2.call(A1("abc", "def")))
assertEquals("abc", A1("abc", "def")::x1.call())
assertEquals("def", A1("abc", "def")::x2.call())
assertEquals(null, A1::x1.call(A1(null, null)))
assertEquals(null, A1::x2.call(A1(null, null)))
assertEquals(null, A1(null, null)::x1.call())
assertEquals(null, A1(null, null)::x2.call())
assertEquals("abc", A2::x1.call(A2("abc", "def")))
assertEquals("def", A2::x2.call(A2("abc", "def")))
assertEquals("abc", A2("abc", "def")::x1.call())
assertEquals("def", A2("abc", "def")::x2.call())
assertEquals(Z(42U, 43), Z2::x1.call(Z2(Z(42U, 43), Z(44U, 45))))
assertEquals(Z(44U, 45), Z2::x2.call(Z2(Z(42U, 43), Z(44U, 45))))
assertEquals(Z(42U, 43), Z2(Z(42U, 43), Z(44U, 45))::x1.call())
assertEquals(Z(44U, 45), Z2(Z(42U, 43), Z(44U, 45))::x2.call())
assertEquals(L(1234UL, 5678L), L2::x1.call(L2(L(1234UL, 5678L), L(12340UL, -5678L))))
assertEquals(L(12340UL, -5678L), L2::x2.call(L2(L(1234UL, 5678L), L(12340UL, -5678L))))
assertEquals(L(1234UL, 5678L), L2(L(1234UL, 5678L), L(12340UL, -5678L))::x1.call())
assertEquals(L(12340UL, -5678L), L2(L(1234UL, 5678L), L(12340UL, -5678L))::x2.call())
assertEquals(A1("abc", "def"), A1_2::x1.call(A1_2(A1("abc", "def"), A1("geh", "ijk"))))
assertEquals(A1("geh", "ijk"), A1_2::x2.call(A1_2(A1("abc", "def"), A1("geh", "ijk"))))
assertEquals(A1("abc", "def"), A1_2(A1("abc", "def"), A1("geh", "ijk"))::x1.call())
assertEquals(A1("geh", "ijk"), A1_2(A1("abc", "def"), A1("geh", "ijk"))::x2.call())
assertEquals(A1(null, null), A1_2::x1.call(A1_2(A1(null, null), A1(null, null))))
assertEquals(A1(null, null), A1_2::x2.call(A1_2(A1(null, null), A1(null, null))))
assertEquals(A1(null, null), A1_2(A1(null, null), A1(null, null))::x1.call())
assertEquals(A1(null, null), A1_2(A1(null, null), A1(null, null))::x2.call())
assertEquals(A2("abc", "def"), A2_2::x1.call(A2_2(A2("abc", "def"), A2("geh", "ijk"))))
assertEquals(A2("geh", "ijk"), A2_2::x2.call(A2_2(A2("abc", "def"), A2("geh", "ijk"))))
assertEquals(A2("abc", "def"), A2_2(A2("abc", "def"), A2("geh", "ijk"))::x1.call())
assertEquals(A2("geh", "ijk"), A2_2(A2("abc", "def"), A2("geh", "ijk"))::x2.call())
return "OK"
}
@@ -0,0 +1,53 @@
// TARGET_BACKEND: JVM_IR
// JVM_TARGET: 1.8
// WITH_REFLECT
// LANGUAGE: +ValueClasses
import kotlin.reflect.KMutableProperty1
import kotlin.reflect.jvm.isAccessible
import kotlin.test.assertEquals
@JvmInline
value class Z(val value1: UInt, val value2: Int) {
operator fun plus(other: Z): Z = Z(this.value1 + other.value1, this.value2 + other.value2)
}
object C {
@JvmStatic
private var p1: Z = Z(UInt.MAX_VALUE, -10)
@JvmStatic
private var p2: Z? = Z(UInt.MAX_VALUE, -10)
fun nonNullBoundRef() = this::p1.apply { isAccessible = true }
fun nullableBoundRef() = this::p2.apply { isAccessible = true }
}
fun box(): String {
val one = Z(1U, 10)
val two = Z(2U, 20)
val nonNullUnboundRef = C::class.members.single { it.name == "p1" } as KMutableProperty1<C, Z>
nonNullUnboundRef.isAccessible = true
assertEquals(Unit, nonNullUnboundRef.setter.call(C, one))
assertEquals(one, nonNullUnboundRef.call(C))
assertEquals(one, nonNullUnboundRef.getter.call(C))
val nullableUnboundRef = C::class.members.single { it.name == "p2" } as KMutableProperty1<C, Z?>
nullableUnboundRef.isAccessible = true
assertEquals(Unit, nullableUnboundRef.setter.call(C, one))
assertEquals(one, nullableUnboundRef.call(C))
assertEquals(one, nullableUnboundRef.getter.call(C))
val nonNullBoundRef = C.nonNullBoundRef()
assertEquals(Unit, nonNullBoundRef.setter.call(two))
assertEquals(two, nonNullBoundRef.call())
assertEquals(two, nonNullBoundRef.getter.call())
val nullableBoundRef = C.nullableBoundRef()
assertEquals(Unit, nullableBoundRef.setter.call(two))
assertEquals(two, nullableBoundRef.call())
assertEquals(two, nullableBoundRef.getter.call())
return "OK"
}
@@ -0,0 +1,42 @@
// TARGET_BACKEND: JVM_IR
// JVM_TARGET: 1.8
// WITH_REFLECT
// LANGUAGE: +ValueClasses
import kotlin.reflect.KFunction
import kotlin.test.assertEquals
@JvmInline
value class Z(val value1: UInt, val value2: Int) {
operator fun plus(other: Z): Z = Z(this.value1 + other.value1, this.value2 + other.value2)
}
object C {
@JvmStatic
fun foo(x: Z, y1: UInt, y2: Int, z: Z?): Z = x + Z(y1, y2) + z!!
}
interface I {
companion object {
@JvmStatic
fun bar(x1: UInt, x2: Int, y: Z, z: Z?): Z = Z(x1, x2) + y + z!!
}
}
fun box(): String {
val one = Z(1U, -1)
val two = Z(2U, -2)
val four = Z(4U, -4)
val seven = Z(7U, -7)
assertEquals(seven, C::foo.call(one, 2U, -2, four))
assertEquals(seven, (I)::bar.call(1U, -1, two, four))
val unboundFoo = C::class.members.single { it.name == "foo" } as KFunction<*>
assertEquals(seven, unboundFoo.call(C, one, 2U, -2, four))
val unboundBar = I.Companion::class.members.single { it.name == "bar" } as KFunction<*>
assertEquals(seven, unboundBar.call(I, 1U, -1, two, four))
return "OK"
}
@@ -0,0 +1,82 @@
// TARGET_BACKEND: JVM_IR
// WITH_REFLECT
// LANGUAGE: +ValueClasses
import kotlin.reflect.KCallable
import kotlin.test.assertEquals
@JvmInline
value class Z(val x1: UInt, val x2: Int) {
constructor(a: UInt, b: UInt, c: Int, d: Int) : this(a + b, c + d)
}
@JvmInline
value class L(val x1: ULong, val x2: Long) {
constructor(a: ULong, b: ULong, c: Long, d: Long) : this(a + b, c + d)
}
@JvmInline
value class S1(val x1: String, val x2: String) {
constructor(a: String, b: String, c: String, d: String) : this(a + b, c + d)
}
@JvmInline
value class S2(val x1: String?, val x2: String?) {
constructor(a: String?, b: String?, c: String?, d: String?) : this(a!! + b!!, c!! + d!!)
}
@JvmInline
value class A(val x1: Any, val x2: Any) {
constructor(a: String, b: String, c: String, d: String) : this(a + b, c + d)
}
@JvmInline
value class Z2(val z1: Z, val z2: Z) {
constructor(z1: Z, z2: Z, z3: Z, z4: Z) : this(Z(z1.x1 + z2.x1, z1.x2 + z2.x2), Z(z3.x1 + z4.x1, z3.x2 + z4.x2))
}
@JvmInline
value class Z3(val z1: Z?, val z2: Z?) {
constructor(z1: Z?, z2: Z?, z3: Z?, z4: Z?) : this(Z(z1!!.x1 + z2!!.x1, z1!!.x2 + z2!!.x2), Z(z3!!.x1 + z4!!.x1, z3!!.x2 + z4!!.x2))
}
fun box(): String {
val ctorZ1_1: (UInt, Int) -> Z = ::Z
val ctorZ1_2: (UInt, UInt, Int, Int) -> Z = ::Z
val ctorL1: (ULong, Long) -> L = ::L
val ctorL2: (ULong, ULong, Long, Long) -> L = ::L
val ctorS1_1: (String, String) -> S1 = ::S1
val ctorS1_2: (String, String, String, String) -> S1 = ::S1
val ctorS2_1: (String, String) -> S2 = ::S2
val ctorS2_2: (String, String, String, String) -> S2 = ::S2
val ctorA1: (Any, Any) -> A = ::A
val ctorA2: (String, String, String, String) -> A = ::A
val ctorZ2_2: (Z, Z) -> Z2 = ::Z2
val ctorZ2_4: (Z, Z, Z, Z) -> Z2 = ::Z2
val ctorZ3_2: (Z, Z) -> Z3 = ::Z3
val ctorZ3_4: (Z, Z, Z, Z) -> Z3 = ::Z3
assertEquals(Z(42U, 43), (ctorZ1_1 as KCallable<Z>).call(42U, 43))
assertEquals(Z(123U, 224), (ctorZ1_2 as KCallable<Z>).call(100U, 23U, 200, 24))
assertEquals(L(1UL, 2L), (ctorL1 as KCallable<L>).call(1UL, 2L))
assertEquals(L(123UL, 224L), (ctorL2 as KCallable<L>).call(100UL, 23UL, 200L, 24L))
assertEquals(S1("abc", "def"), (ctorS1_1 as KCallable<S1>).call("abc", "def"))
assertEquals(S1("abc", "def"), (ctorS1_2 as KCallable<S1>).call("ab", "c", "de", "f"))
assertEquals(S2("abc", "def"), (ctorS2_1 as KCallable<S2>).call("abc", "def"))
assertEquals(S2("abc", "def"), (ctorS2_2 as KCallable<S2>).call("ab", "c", "de", "f"))
assertEquals(A("abc", "def"), (ctorA1 as KCallable<A>).call("abc", "def"))
assertEquals(A("abc", "def"), (ctorA2 as KCallable<A>).call("a", "bc", "d", "ef"))
assertEquals(Z2(Z(42U, 43), Z(44U, 45)), (ctorZ2_2 as KCallable<Z2>).call(Z(42U, 43), Z(44U, 45)))
assertEquals(Z3(Z(42U, 43), Z(44U, 45)), (ctorZ3_2 as KCallable<Z3>).call(Z(42U, 43), Z(44U, 45)))
assertEquals(
Z2(Z(142U, 243), Z(344U, 445)),
(ctorZ2_4 as KCallable<Z2>).call(Z(42U, 43), Z(100U, 200), Z(44U, 45), Z(300U, 400))
)
assertEquals(
Z3(Z(142U, 243), Z(344U, 445)),
(ctorZ3_4 as KCallable<Z3>).call(Z(42U, 43), Z(100U, 200), Z(44U, 45), Z(300U, 400))
)
return "OK"
}
@@ -0,0 +1,37 @@
// TARGET_BACKEND: JVM_IR
// WITH_REFLECT
// LANGUAGE: +ValueClasses
import kotlin.test.assertEquals
@JvmInline
value class Z(val x1: UInt, val x2: Int) {
fun test(a: Int, b: Z, c: Z?) = "$x1$x2$a${b.x1}${b.x2}${c!!.x1}${c!!.x2}"
}
@JvmInline
value class S(val x1: String, val x2: String) {
fun test(a: Int, b: Z, c: Z?) = "$x1$x2$a${b.x1}${b.x2}${c!!.x1}${c!!.x2}"
}
@JvmInline
value class A(val x1: Any, val x2: Any) {
fun test(a: Int, b: Z, c: Z?) = "$x1$x2$a${b.x1}${b.x2}${c!!.x1}${c!!.x2}"
}
fun box(): String {
val two = Z(2U, 3)
val four = Z(4U, 5)
val expected = "0912345"
assertEquals(expected, Z::test.call(Z(0U, 9), 1, two, four))
assertEquals(expected, Z(0U, 9)::test.call(1, two, four))
assertEquals(expected, S::test.call(S("0", "9"), 1, two, four))
assertEquals(expected, S("0", "9")::test.call(1, two, four))
assertEquals(expected, A::test.call(A(0U, 9), 1, two, four))
assertEquals(expected, A(0U, 9)::test.call(1, two, four))
return "OK"
}
@@ -0,0 +1,127 @@
// TARGET_BACKEND: JVM_IR
// WITH_REFLECT
// LANGUAGE: +ValueClasses
import kotlin.test.assertEquals
var global = Z(0U, 0)
@JvmInline
value class Z(val x1: UInt, val x2: Int) {
var nonNullTest: Z
get() = Z(global.x1 + this.x1, global.x2 + this.x2)
set(value) {
global = Z(this.x1 + value.x1, this.x2 + value.x2)
}
var nullableTest: Z?
get() = Z(global.x1 + this.x1, global.x2 + this.x2)
set(value) {
global = Z(this.x1 + value!!.x1, this.x2 + value!!.x2)
}
}
@JvmInline
value class S(val x1: String, val x2: String) {
var nonNullTest: Z
get() = Z(global.x1 + x1.toUInt(), global.x2 + x2.toInt())
set(value) {
global = Z(this.x1.toUInt() + value.x1, this.x2.toInt() + value.x2)
}
var nullableTest: Z?
get() = Z(global.x1 + x1.toUInt(), global.x2 + x2.toInt())
set(value) {
global = Z(this.x1.toUInt() + value!!.x1, this.x2.toInt() + value!!.x2)
}
}
@JvmInline
value class A(val x1: Any, val x2: Any) {
var nonNullTest: Z
get() = Z(global.x1 + this.x1 as UInt, global.x2 + this.x2 as Int)
set(value) {
global = Z(this.x1 as UInt + value.x1, this.x2 as Int + value.x2)
}
var nullableTest: Z?
get() = Z(global.x1 + this.x1 as UInt, global.x2 + this.x2 as Int)
set(value) {
global = Z(this.x1 as UInt + value!!.x1, this.x2 as Int + value!!.x2)
}
}
fun box(): String {
val zZero = Z(0U, 0)
val zOne = Z(1U, -1)
val zTwo = Z(2U, -2)
val zThree = Z(3U, -3)
val zFour = Z(4U, -4)
val sOne = S("1", "-1")
val aOne = A(1U, -1)
global = zZero
assertEquals(zOne, Z::nonNullTest.call(zOne))
assertEquals(zOne, zOne::nonNullTest.call())
assertEquals(zOne, Z::nonNullTest.getter.call(zOne))
assertEquals(zOne, zOne::nonNullTest.getter.call())
Z::nonNullTest.setter.call(zOne, zTwo)
assertEquals(zThree, global)
zOne::nonNullTest.setter.call(zThree)
assertEquals(zFour, global)
global = zZero
assertEquals(zOne, Z::nullableTest.call(zOne))
assertEquals(zOne, zOne::nullableTest.call())
assertEquals(zOne, Z::nullableTest.getter.call(zOne))
assertEquals(zOne, zOne::nullableTest.getter.call())
Z::nullableTest.setter.call(zOne, zTwo)
assertEquals(zThree, global)
zOne::nullableTest.setter.call(zThree)
assertEquals(zFour, global)
global = zZero
assertEquals(zOne, S::nonNullTest.call(sOne))
assertEquals(zOne, sOne::nonNullTest.call())
assertEquals(zOne, S::nonNullTest.getter.call(sOne))
assertEquals(zOne, sOne::nonNullTest.getter.call())
S::nonNullTest.setter.call(sOne, zTwo)
assertEquals(zThree, global)
sOne::nonNullTest.setter.call(zThree)
assertEquals(zFour, global)
global = zZero
assertEquals(zOne, S::nullableTest.call(sOne))
assertEquals(zOne, sOne::nullableTest.call())
assertEquals(zOne, S::nullableTest.getter.call(sOne))
assertEquals(zOne, sOne::nullableTest.getter.call())
S::nullableTest.setter.call(sOne, zTwo)
assertEquals(zThree, global)
sOne::nullableTest.setter.call(zThree)
assertEquals(zFour, global)
global = zZero
assertEquals(zOne, A::nonNullTest.call(aOne))
assertEquals(zOne, aOne::nonNullTest.call())
assertEquals(zOne, A::nonNullTest.getter.call(aOne))
assertEquals(zOne, aOne::nonNullTest.getter.call())
A::nonNullTest.setter.call(aOne, zTwo)
assertEquals(zThree, global)
aOne::nonNullTest.setter.call(zThree)
assertEquals(zFour, global)
global = zZero
assertEquals(zOne, A::nullableTest.call(aOne))
assertEquals(zOne, aOne::nullableTest.call())
assertEquals(zOne, A::nullableTest.getter.call(aOne))
assertEquals(zOne, aOne::nullableTest.getter.call())
A::nullableTest.setter.call(aOne, zTwo)
assertEquals(zThree, global)
aOne::nullableTest.setter.call(zThree)
assertEquals(zFour, global)
return "OK"
}
@@ -0,0 +1,40 @@
// TARGET_BACKEND: JVM_IR
// WITH_REFLECT
// LANGUAGE: +ValueClasses
import kotlin.test.assertEquals
interface ITest {
fun test(a: Int, b: Z, c: Z?): String
}
@JvmInline
value class Z(val x1: UInt, val x2: Int) : ITest {
override fun test(a: Int, b: Z, c: Z?) = "$x1$x2$a${b.x1}${b.x2}${c!!.x1}${c!!.x2}"
}
@JvmInline
value class S(val x1: String, val x2: String) : ITest {
override fun test(a: Int, b: Z, c: Z?) = "$x1$x2$a${b.x1}${b.x2}${c!!.x1}${c!!.x2}"
}
@JvmInline
value class A(val x1: Any, val x2: Any) : ITest {
override fun test(a: Int, b: Z, c: Z?) = "$x1$x2$a${b.x1}${b.x2}${c!!.x1}${c!!.x2}"
}
fun box(): String {
val two = Z(2U, 3)
val four = Z(4U, 5)
assertEquals("0912345", Z::test.call(Z(0U, 9), 1, two, four))
assertEquals("0912345", Z(0U, 9)::test.call(1, two, four))
assertEquals("0912345", S::test.call(S("0", "9"), 1, two, four))
assertEquals("0912345", S("0", "9")::test.call(1, two, four))
assertEquals("0912345", A::test.call(A(0U, 9), 1, two, four))
assertEquals("0912345", A(0U, 9)::test.call(1, two, four))
return "OK"
}
@@ -0,0 +1,132 @@
// TARGET_BACKEND: JVM_IR
// WITH_REFLECT
// LANGUAGE: +ValueClasses
import kotlin.test.assertEquals
var global = Z(0U, 0)
interface ITest {
var nonNullTest: Z
var nullableTest: Z?
}
@JvmInline
value class Z(val x1: UInt, val x2: Int) : ITest {
override var nonNullTest: Z
get() = Z(global.x1 + this.x1, global.x2 + this.x2)
set(value) {
global = Z(this.x1 + value.x1, this.x2 + value.x2)
}
override var nullableTest: Z?
get() = Z(global.x1 + this.x1, global.x2 + this.x2)
set(value) {
global = Z(this.x1 + value!!.x1, this.x2 + value!!.x2)
}
}
@JvmInline
value class S(val x1: String, val x2: String) : ITest {
override var nonNullTest: Z
get() = Z(global.x1 + x1.toUInt(), global.x2 + x2.toInt())
set(value) {
global = Z(this.x1.toUInt() + value.x1, this.x2.toInt() + value.x2)
}
override var nullableTest: Z?
get() = Z(global.x1 + x1.toUInt(), global.x2 + x2.toInt())
set(value) {
global = Z(this.x1.toUInt() + value!!.x1, this.x2.toInt() + value!!.x2)
}
}
@JvmInline
value class A(val x1: Any, val x2: Any) : ITest {
override var nonNullTest: Z
get() = Z(global.x1 + this.x1 as UInt, global.x2 + this.x2 as Int)
set(value) {
global = Z(this.x1 as UInt + value.x1, this.x2 as Int + value.x2)
}
override var nullableTest: Z?
get() = Z(global.x1 + this.x1 as UInt, global.x2 + this.x2 as Int)
set(value) {
global = Z(this.x1 as UInt + value!!.x1, this.x2 as Int + value!!.x2)
}
}
fun box(): String {
val zZero = Z(0U, 0)
val zOne = Z(1U, -1)
val zTwo = Z(2U, -2)
val zThree = Z(3U, -3)
val zFour = Z(4U, -4)
val sOne = S("1", "-1")
val aOne = A(1U, -1)
global = zZero
assertEquals(zOne, Z::nonNullTest.call(zOne))
assertEquals(zOne, zOne::nonNullTest.call())
assertEquals(zOne, Z::nonNullTest.getter.call(zOne))
assertEquals(zOne, zOne::nonNullTest.getter.call())
Z::nonNullTest.setter.call(zOne, zTwo)
assertEquals(zThree, global)
zOne::nonNullTest.setter.call(zThree)
assertEquals(zFour, global)
global = zZero
assertEquals(zOne, Z::nullableTest.call(zOne))
assertEquals(zOne, zOne::nullableTest.call())
assertEquals(zOne, Z::nullableTest.getter.call(zOne))
assertEquals(zOne, zOne::nullableTest.getter.call())
Z::nullableTest.setter.call(zOne, zTwo)
assertEquals(zThree, global)
zOne::nullableTest.setter.call(zThree)
assertEquals(zFour, global)
global = zZero
assertEquals(zOne, S::nonNullTest.call(sOne))
assertEquals(zOne, sOne::nonNullTest.call())
assertEquals(zOne, S::nonNullTest.getter.call(sOne))
assertEquals(zOne, sOne::nonNullTest.getter.call())
S::nonNullTest.setter.call(sOne, zTwo)
assertEquals(zThree, global)
sOne::nonNullTest.setter.call(zThree)
assertEquals(zFour, global)
global = zZero
assertEquals(zOne, S::nullableTest.call(sOne))
assertEquals(zOne, sOne::nullableTest.call())
assertEquals(zOne, S::nullableTest.getter.call(sOne))
assertEquals(zOne, sOne::nullableTest.getter.call())
S::nullableTest.setter.call(sOne, zTwo)
assertEquals(zThree, global)
sOne::nullableTest.setter.call(zThree)
assertEquals(zFour, global)
global = zZero
assertEquals(zOne, A::nonNullTest.call(aOne))
assertEquals(zOne, aOne::nonNullTest.call())
assertEquals(zOne, A::nonNullTest.getter.call(aOne))
assertEquals(zOne, aOne::nonNullTest.getter.call())
A::nonNullTest.setter.call(aOne, zTwo)
assertEquals(zThree, global)
aOne::nonNullTest.setter.call(zThree)
assertEquals(zFour, global)
global = zZero
assertEquals(zOne, A::nullableTest.call(aOne))
assertEquals(zOne, aOne::nullableTest.call())
assertEquals(zOne, A::nullableTest.getter.call(aOne))
assertEquals(zOne, aOne::nullableTest.getter.call())
A::nullableTest.setter.call(aOne, zTwo)
assertEquals(zThree, global)
aOne::nullableTest.setter.call(zThree)
assertEquals(zFour, global)
return "OK"
}
@@ -0,0 +1,180 @@
// TARGET_BACKEND: JVM_IR
// WITH_REFLECT
// LANGUAGE: +ValueClasses
import kotlin.test.assertEquals
@JvmInline
value class Z(val x1: UInt, val x2: Int) {
var x3
get() = x1
set(value) = Unit
}
@JvmInline
value class Z2(val x1: Z, val x2: Z) {
var x3
get() = x1
set(value) = Unit
}
@JvmInline
value class L(val x1: ULong, val x2: Long) {
var x3
get() = x1
set(value) = Unit
}
@JvmInline
value class L2(val x1: L, val x2: L) {
var x3
get() = x1
set(value) = Unit
}
@JvmInline
value class A1(val x1: Any?, val x2: Any?) {
var x3
get() = x1
set(value) = Unit
}
@JvmInline
value class A1_2(val x1: A1, val x2: A1) {
var x3
get() = x1
set(value) = Unit
}
@JvmInline
value class A2(val x1: Any, val x2: Any) {
var x3
get() = x1
set(value) = Unit
}
@JvmInline
value class A2_2(val x1: A2, val x2: A2) {
var x3
get() = x1
set(value) = Unit
}
fun box(): String {
assertEquals(42U, Z::x1.call(Z(42U, 43)))
assertEquals(43, Z::x2.call(Z(42U, 43)))
assertEquals(42U, Z::x3.call(Z(42U, 43)))
assertEquals(42U, Z::x3.getter.call(Z(42U, 43)))
assertEquals(Unit, Z::x3.setter.call(Z(42U, 43), 42U))
assertEquals(42U, Z(42U, 43)::x1.call())
assertEquals(43, Z(42U, 43)::x2.call())
assertEquals(42U, Z(42U, 43)::x3.call())
assertEquals(42U, Z(42U, 43)::x3.getter.call())
assertEquals(Unit, Z(42U, 43)::x3.setter.call(42U))
assertEquals(1234UL, L::x1.call(L(1234UL, 5678L)))
assertEquals(5678L, L::x2.call(L(1234UL, 5678L)))
assertEquals(1234UL, L::x3.call(L(1234UL, 5678L)))
assertEquals(1234UL, L::x3.getter.call(L(1234UL, 5678L)))
assertEquals(Unit, L::x3.setter.call(L(1234UL, 5678L), 1234UL))
assertEquals(1234UL, L(1234UL, 5678L)::x1.call())
assertEquals(5678L, L(1234UL, 5678L)::x2.call())
assertEquals(1234UL, L(1234UL, 5678L)::x3.call())
assertEquals(1234UL, L(1234UL, 5678L)::x3.getter.call())
assertEquals(Unit, L(1234UL, 5678L)::x3.setter.call(1234UL))
assertEquals("abc", A1::x1.call(A1("abc", "def")))
assertEquals("def", A1::x2.call(A1("abc", "def")))
assertEquals("abc", A1::x3.call(A1("abc", "def")))
assertEquals("abc", A1::x3.getter.call(A1("abc", "def")))
assertEquals(Unit, A1::x3.setter.call(A1("abc", "def"), "abc"))
assertEquals("abc", A1("abc", "def")::x1.call())
assertEquals("def", A1("abc", "def")::x2.call())
assertEquals("abc", A1("abc", "def")::x3.call())
assertEquals("abc", A1("abc", "def")::x3.getter.call())
assertEquals(Unit, A1("abc", "def")::x3.setter.call("abc"))
assertEquals(null, A1::x1.call(A1(null, null)))
assertEquals(null, A1::x2.call(A1(null, null)))
assertEquals(null, A1::x3.call(A1(null, null)))
assertEquals(null, A1::x3.getter.call(A1(null, null)))
assertEquals(Unit, A1::x3.setter.call(A1(null, null), null))
assertEquals(null, A1(null, null)::x1.call())
assertEquals(null, A1(null, null)::x2.call())
assertEquals(null, A1(null, null)::x3.call())
assertEquals(null, A1(null, null)::x3.getter.call())
assertEquals(Unit, A1(null, null)::x3.setter.call(null))
assertEquals("abc", A2::x1.call(A2("abc", "def")))
assertEquals("def", A2::x2.call(A2("abc", "def")))
assertEquals("abc", A2::x3.call(A2("abc", "def")))
assertEquals("abc", A2::x3.getter.call(A2("abc", "def")))
assertEquals(Unit, A2::x3.setter.call(A2("abc", "def"), "abc"))
assertEquals("abc", A2("abc", "def")::x1.call())
assertEquals("def", A2("abc", "def")::x2.call())
assertEquals("abc", A2("abc", "def")::x3.call())
assertEquals("abc", A2("abc", "def")::x3.getter.call())
assertEquals(Unit, A2("abc", "def")::x3.setter.call("abc"))
assertEquals(Z(42U, 43), Z2::x1.call(Z2(Z(42U, 43), Z(44U, 45))))
assertEquals(Z(44U, 45), Z2::x2.call(Z2(Z(42U, 43), Z(44U, 45))))
assertEquals(Z(42U, 43), Z2::x3.call(Z2(Z(42U, 43), Z(44U, 45))))
assertEquals(Z(42U, 43), Z2::x3.getter.call(Z2(Z(42U, 43), Z(44U, 45))))
assertEquals(Unit, Z2::x3.setter.call(Z2(Z(42U, 43), Z(44U, 45)), Z(42U, 43)))
assertEquals(Z(42U, 43), Z2(Z(42U, 43), Z(44U, 45))::x1.call())
assertEquals(Z(44U, 45), Z2(Z(42U, 43), Z(44U, 45))::x2.call())
assertEquals(Z(42U, 43), Z2(Z(42U, 43), Z(44U, 45))::x3.call())
assertEquals(Z(42U, 43), Z2(Z(42U, 43), Z(44U, 45))::x3.getter.call())
assertEquals(Unit, Z2(Z(42U, 43), Z(44U, 45))::x3.setter.call(Z(42U, 43)))
assertEquals(L(1234UL, 5678L), L2::x1.call(L2(L(1234UL, 5678L), L(12340UL, -5678L))))
assertEquals(L(12340UL, -5678L), L2::x2.call(L2(L(1234UL, 5678L), L(12340UL, -5678L))))
assertEquals(L(1234UL, 5678L), L2::x3.call(L2(L(1234UL, 5678L), L(12340UL, -5678L))))
assertEquals(L(1234UL, 5678L), L2::x3.getter.call(L2(L(1234UL, 5678L), L(12340UL, -5678L))))
assertEquals(Unit, L2::x3.setter.call(L2(L(1234UL, 5678L), L(12340UL, -5678L)), L(1234UL, 5678L)))
assertEquals(L(1234UL, 5678L), L2(L(1234UL, 5678L), L(12340UL, -5678L))::x1.call())
assertEquals(L(12340UL, -5678L), L2(L(1234UL, 5678L), L(12340UL, -5678L))::x2.call())
assertEquals(L(1234UL, 5678L), L2(L(1234UL, 5678L), L(12340UL, -5678L))::x3.call())
assertEquals(L(1234UL, 5678L), L2(L(1234UL, 5678L), L(12340UL, -5678L))::x3.getter.call())
assertEquals(Unit, L2(L(1234UL, 5678L), L(12340UL, -5678L))::x3.setter.call(L(1234UL, 5678L)))
assertEquals(A1("abc", "def"), A1_2::x1.call(A1_2(A1("abc", "def"), A1("geh", "ijk"))))
assertEquals(A1("geh", "ijk"), A1_2::x2.call(A1_2(A1("abc", "def"), A1("geh", "ijk"))))
assertEquals(A1("abc", "def"), A1_2::x3.call(A1_2(A1("abc", "def"), A1("geh", "ijk"))))
assertEquals(A1("abc", "def"), A1_2::x3.getter.call(A1_2(A1("abc", "def"), A1("geh", "ijk"))))
assertEquals(Unit, A1_2::x3.setter.call(A1_2(A1("abc", "def"), A1("geh", "ijk")), A1("abc", "def")))
assertEquals(A1("abc", "def"), A1_2(A1("abc", "def"), A1("geh", "ijk"))::x1.call())
assertEquals(A1("geh", "ijk"), A1_2(A1("abc", "def"), A1("geh", "ijk"))::x2.call())
assertEquals(A1("abc", "def"), A1_2(A1("abc", "def"), A1("geh", "ijk"))::x3.call())
assertEquals(A1("abc", "def"), A1_2(A1("abc", "def"), A1("geh", "ijk"))::x3.getter.call())
assertEquals(Unit, A1_2(A1("abc", "def"), A1("geh", "ijk"))::x3.setter.call(A1("abc", "def")))
assertEquals(A1(null, null), A1_2::x1.call(A1_2(A1(null, null), A1(null, null))))
assertEquals(A1(null, null), A1_2::x2.call(A1_2(A1(null, null), A1(null, null))))
assertEquals(A1(null, null), A1_2::x3.call(A1_2(A1(null, null), A1(null, null))))
assertEquals(A1(null, null), A1_2::x3.getter.call(A1_2(A1(null, null), A1(null, null))))
assertEquals(Unit, A1_2::x3.setter.call(A1_2(A1(null, null), A1(null, null)), A1(null, null)))
assertEquals(A1(null, null), A1_2(A1(null, null), A1(null, null))::x1.call())
assertEquals(A1(null, null), A1_2(A1(null, null), A1(null, null))::x2.call())
assertEquals(A1(null, null), A1_2(A1(null, null), A1(null, null))::x3.call())
assertEquals(A1(null, null), A1_2(A1(null, null), A1(null, null))::x3.getter.call())
assertEquals(Unit, A1_2(A1(null, null), A1(null, null))::x3.setter.call(A1(null, null)))
assertEquals(A2("abc", "def"), A2_2::x1.call(A2_2(A2("abc", "def"), A2("geh", "ijk"))))
assertEquals(A2("geh", "ijk"), A2_2::x2.call(A2_2(A2("abc", "def"), A2("geh", "ijk"))))
assertEquals(A2("abc", "def"), A2_2::x3.call(A2_2(A2("abc", "def"), A2("geh", "ijk"))))
assertEquals(A2("abc", "def"), A2_2::x3.getter.call(A2_2(A2("abc", "def"), A2("geh", "ijk"))))
assertEquals(Unit, A2_2::x3.setter.call(A2_2(A2("abc", "def"), A2("geh", "ijk")), A2("abc", "def")))
assertEquals(A2("abc", "def"), A2_2(A2("abc", "def"), A2("geh", "ijk"))::x1.call())
assertEquals(A2("geh", "ijk"), A2_2(A2("abc", "def"), A2("geh", "ijk"))::x2.call())
assertEquals(A2("abc", "def"), A2_2(A2("abc", "def"), A2("geh", "ijk"))::x3.call())
assertEquals(A2("abc", "def"), A2_2(A2("abc", "def"), A2("geh", "ijk"))::x3.getter.call())
assertEquals(Unit, A2_2(A2("abc", "def"), A2("geh", "ijk"))::x3.setter.call(A2("abc", "def")))
return "OK"
}
@@ -0,0 +1,122 @@
// TARGET_BACKEND: JVM_IR
// WITH_REFLECT
// LANGUAGE: +ValueClasses
import kotlin.reflect.KMutableProperty2
import kotlin.test.assertEquals
@JvmInline
value class Z(val value1: UInt, val value2: Int) {
operator fun plus(other: Z): Z = Z(this.value1 + other.value1, this.value2 + other.value2)
}
class C {
var nonNullMember: Z = Z(0U, 0)
var nullableMember: Z? = Z(0U, 0)
private var offset = Z(0U, 0)
var Z.nonNull_nonNullMemExt: Z
get() = this + offset
set(value) { offset = this + value }
var Z.nonNull_nullableMemExt: Z?
get() = this + offset
set(value) { offset = this + value!! }
var Z?.nullable_nonNullMemExt: Z
get() = this!! + offset
set(value) { offset = this!! + value }
var Z?.nullable_nullableMemExt: Z?
get() = this!! + offset
set(value) { offset = this!! + value!! }
}
var nonNullTopLevel: Z = Z(0U, 0)
var nullableTopLevel: Z? = Z(0U, 0)
private var offset = Z(0U, 0)
var Z.nonNull_nonNullExt: Z
get() = this + offset
set(value) { offset = this + value }
var Z.nonNull_nullableExt: Z?
get() = this + offset
set(value) { offset = this + value!! }
var Z?.nullable_nonNullExt: Z
get() = this!! + offset
set(value) { offset = this!! + value }
var Z?.nullable_nullableExt: Z?
get() = this!! + offset
set(value) { offset = this!! + value!! }
fun box(): String {
val one = Z(1U, -1)
val two = Z(2U, -2)
val three = Z(3U, -3)
val c = C()
assertEquals(Unit, C::nonNullMember.setter.call(c, one))
assertEquals(one, C::nonNullMember.call(c))
assertEquals(one, C::nonNullMember.getter.call(c))
assertEquals(Unit, c::nonNullMember.setter.call(two))
assertEquals(two, c::nonNullMember.call())
assertEquals(two, c::nonNullMember.getter.call())
assertEquals(Unit, C::nullableMember.setter.call(c, one))
assertEquals(one, C::nullableMember.call(c))
assertEquals(one, C::nullableMember.getter.call(c))
assertEquals(Unit, c::nullableMember.setter.call(two))
assertEquals(two, c::nullableMember.call())
assertEquals(two, c::nullableMember.getter.call())
val nonNull_nonNullMemExt = C::class.members.single { it.name == "nonNull_nonNullMemExt" } as KMutableProperty2<C, Z, Z>
assertEquals(Unit, nonNull_nonNullMemExt.setter.call(c, Z(0U, 0), two))
assertEquals(three, nonNull_nonNullMemExt.call(c, one))
assertEquals(three, nonNull_nonNullMemExt.getter.call(c, one))
val nonNull_nullableMemExt = C::class.members.single { it.name == "nonNull_nullableMemExt" } as KMutableProperty2<C, Z, Z?>
assertEquals(Unit, nonNull_nullableMemExt.setter.call(c, Z(0U, 0), two))
assertEquals(three, nonNull_nullableMemExt.call(c, one))
assertEquals(three, nonNull_nullableMemExt.getter.call(c, one))
val nullable_nonNullMemExt = C::class.members.single { it.name == "nullable_nonNullMemExt" } as KMutableProperty2<C, Z?, Z>
assertEquals(Unit, nullable_nonNullMemExt.setter.call(c, Z(0U, 0), two))
assertEquals(three, nullable_nonNullMemExt.call(c, one))
assertEquals(three, nullable_nonNullMemExt.getter.call(c, one))
val nullable_nullableMemExt = C::class.members.single { it.name == "nullable_nullableMemExt" } as KMutableProperty2<C, Z?, Z?>
assertEquals(Unit, nullable_nullableMemExt.setter.call(c, Z(0U, 0), two))
assertEquals(three, nullable_nullableMemExt.call(c, one))
assertEquals(three, nullable_nullableMemExt.getter.call(c, one))
assertEquals(Unit, ::nonNullTopLevel.setter.call(one))
assertEquals(one, ::nonNullTopLevel.call())
assertEquals(one, ::nonNullTopLevel.getter.call())
assertEquals(Unit, ::nullableTopLevel.setter.call(one))
assertEquals(one, ::nullableTopLevel.call())
assertEquals(one, ::nullableTopLevel.getter.call())
assertEquals(Unit, Z::nonNull_nonNullExt.setter.call(Z(0U, 0), two))
assertEquals(three, Z::nonNull_nonNullExt.call(one))
assertEquals(three, Z::nonNull_nonNullExt.getter.call(one))
assertEquals(Unit, Z::nonNull_nullableExt.setter.call(Z(0U, 0), two))
assertEquals(three, Z::nonNull_nullableExt.call(one))
assertEquals(three, Z::nonNull_nullableExt.getter.call(one))
assertEquals(Unit, Z?::nullable_nonNullExt.setter.call(Z(0U, 0), two))
assertEquals(three, Z?::nullable_nonNullExt.call(one))
assertEquals(three, Z?::nullable_nonNullExt.getter.call(one))
assertEquals(Unit, Z?::nullable_nullableExt.setter.call(Z(0U, 0), two))
assertEquals(three, Z?::nullable_nullableExt.call(one))
assertEquals(three, Z?::nullable_nullableExt.getter.call(one))
return "OK"
}
@@ -0,0 +1,91 @@
// TARGET_BACKEND: JVM_IR
// WITH_REFLECT
// WITH_COROUTINES
// LANGUAGE: +ValueClasses
import kotlin.coroutines.startCoroutine
import kotlin.reflect.full.callSuspend
import kotlin.test.assertEquals
import kotlin.test.assertFailsWith
import helpers.*
@JvmInline
value class Z(val value1: UInt, val value2: Int)
class C {
private var value: Z = Z(0U, 0)
suspend fun nonNullConsume(z: Z) { value = z }
suspend fun nonNullProduce(): Z = value
suspend fun nullableConsume(z: Z?) { value = z!! }
suspend fun nullableProduce(): Z? = value
suspend fun nonNull_nonNullConsumeAndProduce(z: Z): Z = z
suspend fun nonNull_nullableConsumeAndProduce(z: Z): Z? = z
suspend fun nullable_nonNullConsumeAndProduce(z: Z?): Z = z!!
suspend fun nullable_nullableConsumeAndProduce(z: Z?): Z? = z
}
private fun run0(f: suspend () -> Int): Int {
var result = -1
f.startCoroutine(handleResultContinuation { result = it })
return result
}
private fun run0U(f: suspend () -> UInt): UInt {
var result = UInt.MAX_VALUE
f.startCoroutine(handleResultContinuation { result = it })
return result
}
fun box(): String {
val c = C()
run0U {
C::nonNullConsume.callSuspend(c, Z(1U, -1))
C::nonNullProduce.callSuspend(c).value1
}.let { assertEquals(1U, it) }
run0 {
C::nonNullConsume.callSuspend(c, Z(1U, -1))
C::nonNullProduce.callSuspend(c).value2
}.let { assertEquals(-1, it) }
run0U {
C::nullableConsume.callSuspend(c, Z(2U, -2))
C::nullableProduce.callSuspend(c)!!.value1
}.let { assertEquals(2U, it) }
run0 {
C::nullableConsume.callSuspend(c, Z(2U, -2))
C::nullableProduce.callSuspend(c)!!.value2
}.let { assertEquals(-2, it) }
run0U {
C::nonNull_nonNullConsumeAndProduce.callSuspend(c, Z(3U, -3)).value1
}.let { assertEquals(3U, it) }
run0 {
C::nonNull_nonNullConsumeAndProduce.callSuspend(c, Z(3U, -3)).value2
}.let { assertEquals(-3, it) }
run0U {
C::nonNull_nullableConsumeAndProduce.callSuspend(c, Z(4U, -4))!!.value1
}.let { assertEquals(4U, it) }
run0 {
C::nonNull_nullableConsumeAndProduce.callSuspend(c, Z(4U, -4))!!.value2
}.let { assertEquals(-4, it) }
run0U {
C::nullable_nonNullConsumeAndProduce.callSuspend(c, Z(5U, -5)).value1
}.let { assertEquals(5U, it) }
run0 {
C::nullable_nonNullConsumeAndProduce.callSuspend(c, Z(5U, -5)).value2
}.let { assertEquals(-5, it) }
run0U {
C::nullable_nullableConsumeAndProduce.callSuspend(c, Z(6U, -6))!!.value1
}.let { assertEquals(6U, it) }
run0 {
C::nullable_nullableConsumeAndProduce.callSuspend(c, Z(6U, -6))!!.value2
}.let { assertEquals(-6, it) }
return "OK"
}