| // WITH_STDLIB |
| // LANGUAGE: +ValueClasses, +CustomEqualsInValueClasses |
| // TARGET_BACKEND: JVM_IR |
| // CHECK_BYTECODE_LISTING |
| |
| import java.lang.AssertionError |
| import kotlin.math.abs |
| |
| @JvmInline |
| value class IC1(val x: Double) { |
| fun equals(other: IC1): Boolean { |
| return abs(x - other.x) < 0.5 |
| } |
| } |
| |
| @JvmInline |
| value class IC2(val x: Int) { |
| override fun equals(other: Any?): Boolean { |
| if (other !is IC2) { |
| return false |
| } |
| return abs(x - other.x) < 2 |
| } |
| } |
| |
| fun box(): String { |
| val a1Typed: IC1 = IC1(1.0) |
| val b1Typed: IC1 = IC1(1.1) |
| val c1Typed: IC1 = IC1(5.0) |
| val a1Untyped: Any = a1Typed |
| val b1Untyped: Any = b1Typed |
| val c1Untyped: Any = c1Typed |
| |
| val a2Typed: IC2 = IC2(1) |
| val b2Typed: IC2 = IC2(2) |
| val c2Typed: IC2 = IC2(5) |
| val a2Untyped: Any = a2Typed |
| val b2Untyped: Any = b2Typed |
| val c2Untyped: Any = c2Typed |
| |
| if ((a1Typed == b1Typed) != (a1Untyped == b1Untyped)) return "Fail 1" |
| if ((a1Typed == c1Typed) != (a1Untyped == c1Untyped)) return "Fail 2" |
| if ((a2Typed == b2Typed) != (a2Untyped == b2Untyped)) return "Fail 3" |
| if ((a2Typed == c2Typed) != (a2Untyped == c2Untyped)) return "Fail 4" |
| |
| return "OK" |
| } |