// WITH_STDLIB
// LANGUAGE: +ValueClasses, +CustomEqualsInValueClasses
// TARGET_BACKEND: JVM_IR
// CHECK_BYTECODE_LISTING


interface I {
    fun getVal(): Int
}

@JvmInline
value class IC1(val x: Int) : I {
    override fun getVal(): Int {
        return x
    }

    fun equals(other: IC1): Boolean {
        return x == other.x
    }

    override fun equals(other: Any?): Boolean {
        if (other !is I) {
            return false
        }
        return getVal() == other.getVal()
    }

    override fun hashCode(): Int {
        return getVal()
    }
}

@JvmInline
value class IC2(val y: Int) : I {
    override fun getVal(): Int {
        return y * 10
    }

    fun equals(other: IC2): Boolean {
        return y == other.y
    }

    override fun equals(other: Any?): Boolean {
        if (other !is I) {
            return false
        }
        return getVal() == other.getVal()
    }

    override fun hashCode(): Int {
        return getVal()
    }
}

fun box(): String = if (setOf(IC1(10), IC2(1)).size == 1) "OK" else "Fail"
