| // IGNORE_BACKEND_K2: JVM_IR |
| // WITH_STDLIB |
| // TARGET_BACKEND: JVM_IR |
| // LANGUAGE: +ValueClasses +ContextReceivers |
| // CHECK_BYTECODE_LISTING |
| // FIR_IDENTICAL |
| |
| @JvmInline |
| value class IC(val x: UInt) |
| |
| fun ic(x: IC) = x.x |
| fun ic(x: UInt) = ic(IC(x)) |
| |
| @JvmInline |
| value class SimpleMfvc(val x: UInt, val y: IC, val z: String) { |
| companion object { |
| val SimpleMfvc.a1: SimpleMfvc |
| get() = this |
| |
| @JvmStatic |
| val SimpleMfvc.b1: SimpleMfvc |
| get() = this |
| |
| context(b@SimpleMfvc) |
| val a2: SimpleMfvc |
| get() = this@b |
| |
| context(b@SimpleMfvc) |
| @JvmStatic |
| val b2: SimpleMfvc |
| get() = this@b |
| |
| |
| private val SimpleMfvc.private1: SimpleMfvc |
| get() = this |
| |
| @JvmStatic |
| private val SimpleMfvc.private2: SimpleMfvc |
| get() = this |
| |
| context(b@SimpleMfvc) |
| private val private3: SimpleMfvc |
| get() = this@b |
| |
| context(b@SimpleMfvc) |
| @JvmStatic |
| private val private4: SimpleMfvc |
| get() = this@b |
| } |
| |
| val SimpleMfvc.a3: SimpleMfvc |
| get() = this |
| |
| context(SimpleMfvc) |
| val b3: SimpleMfvc |
| get() = this@SimpleMfvc |
| |
| |
| private val SimpleMfvc.private1: SimpleMfvc |
| get() = this@SimpleMfvc |
| context(SimpleMfvc) |
| private val private2: SimpleMfvc |
| get() = this@SimpleMfvc |
| |
| val a4: Int |
| get() = 2 |
| val b4: SimpleMfvc |
| get() = this |
| } |
| |
| fun smfvc(ic: IC, x: SimpleMfvc, ic1: UInt) = ic(ic) + x.x + ic(x.y) + ic1 |
| |
| @JvmInline |
| value class Wrapper(val simpleMfvc: SimpleMfvc) |
| fun smfvc(ic: IC, x: Wrapper, ic1: UInt) = smfvc(ic, x.simpleMfvc, ic1) |
| |
| @JvmInline |
| value class GreaterMfvc(val x: SimpleMfvc, val y: IC, val z: SimpleMfvc) |
| |
| fun gmfvc(ic: IC, x: GreaterMfvc, ic1: UInt) = smfvc(ic, x.x, 0U) + ic(x.y) + smfvc(IC(0U), x.z, ic1) |
| |
| class Extensions { |
| val SimpleMfvc.x1: SimpleMfvc |
| get() = this |
| private val SimpleMfvc.private_: SimpleMfvc |
| get() = this |
| |
| companion object { |
| val SimpleMfvc.y1: SimpleMfvc |
| get() = this |
| |
| @JvmStatic |
| val SimpleMfvc.z1: SimpleMfvc |
| get() = this |
| |
| private val SimpleMfvc.private1: SimpleMfvc |
| get() = this |
| |
| @JvmStatic |
| private val SimpleMfvc.private2: SimpleMfvc |
| get() = this |
| } |
| } |
| |
| class Contexts { |
| context(b@SimpleMfvc) |
| val x1: SimpleMfvc |
| get() = this@b |
| context(b@SimpleMfvc) |
| private val private_: SimpleMfvc |
| get() = this@b |
| |
| companion object { |
| context(b@SimpleMfvc) |
| val y1: SimpleMfvc |
| get() = this@b |
| |
| context(b@SimpleMfvc) |
| @JvmStatic |
| val z1: SimpleMfvc |
| get() = this@b |
| |
| context(b@SimpleMfvc) |
| private val private1: SimpleMfvc |
| get() = this@b |
| |
| context(b@SimpleMfvc) |
| @JvmStatic |
| private val private2: SimpleMfvc |
| get() = this@b |
| } |
| } |
| |
| fun idUnboxed(x: SimpleMfvc) = x |
| fun idBoxed(x: SimpleMfvc?) = x!! |
| |
| fun box(): String { |
| val o1 = IC(2U) |
| require(ic(o1) == 2U) |
| val o2 = SimpleMfvc(1U, o1, "3") |
| val o2_ = SimpleMfvc(1U, o1, "-3") |
| require(smfvc(IC(4U), o2, 5U) == 12U) |
| require(smfvc(IC(4U), Wrapper(o2), 5U) == 12U) |
| val o3 = GreaterMfvc(o2, IC(6U), SimpleMfvc(7U, IC(8U), "9")) |
| require(gmfvc(IC(10U), o3, 11U) == 45U) |
| with(Extensions()) { |
| require(o2.x1 == o2) |
| } |
| with(Extensions.Companion) { |
| require(o2.y1 == o2) |
| require(o2.z1 == o2) |
| } |
| with(o2) { |
| require(Contexts().x1 == o2) |
| require(Contexts.y1 == o2) |
| require(Contexts.z1 == o2) |
| require(o2_.a3 == o2_) |
| require(o2_.b3 == o2_) |
| require(SimpleMfvc.a2 == o2) |
| require(SimpleMfvc.b2 == o2) |
| } |
| with(SimpleMfvc.Companion) { |
| require(o2_.a1 == o2_) |
| require(o2_.b1 == o2_) |
| } |
| |
| require(idUnboxed(idBoxed(idUnboxed(o2) /*boxing*/) /*unbox*/) == o2) |
| |
| require(o2.a4 == 2) |
| require(o2.b4 == o2) |
| require(o2.b4.x == o2.x) |
| require(o2.b4.y == o2.y) |
| require(o2.b4.z == o2.z) |
| |
| return "OK" |
| } |