blob: ed0fe898e92830bf450fe0123dd007a615c09a26 [file]
// LANGUAGE: +FullValueClasses
// CHECK_BYTECODE_TEXT
// MODULE: lib
// FILE: lib.kt
package lib
// Compiled without Valhalla value classes, so it is an identity class in its class file.
abstract value class IdentityBase {
abstract val x: Int
fun twice(): Int = x * 2
}
// MODULE: main(lib)
// VALHALLA_VALUE_CLASSES
// FILE: main.kt
import lib.IdentityBase
value class FromIdentity(override val x: Int) : IdentityBase()
abstract value class Middle : IdentityBase()
value class FromMiddle(override val x: Int) : Middle()
value class Independent(val x: Int)
// Value classes compiled as identity classes are listed anyway, as they become value classes once their superclasses are recompiled.
class Holder(val fromIdentity: FromIdentity, val fromMiddle: FromMiddle, val independent: Independent)
fun box(): String {
if (FromIdentity(1).javaClass.isValue) return "FromIdentity is a value class"
if (Middle::class.java.isValue) return "Middle is a value class"
if (FromMiddle(2).javaClass.isValue) return "FromMiddle is a value class"
if (!Independent(3).javaClass.isValue) return "Independent is not a value class"
if (FromIdentity(21).twice() != 42 || FromMiddle(4).twice() != 8) return "twice"
val holder = Holder(FromIdentity(5), FromMiddle(6), Independent(7))
if (holder.fromIdentity.x + holder.fromMiddle.x + holder.independent.x != 18) return "Holder"
if (FromIdentity(1) != FromIdentity(1) || FromIdentity(1) == FromIdentity(2)) return "equals"
return "OK"
}
// 1 ATTRIBUTE LoadableDescriptors
// 1 ATTRIBUTE LoadableDescriptors : LFromIdentity;, LFromMiddle;, LIndependent;\n