// WITH_STDLIB // LANGUAGE: +ValueClasses, +CustomEqualsInValueClasses // TARGET_BACKEND: JVM_IR @JvmInline value class A(val x: Int) { operator fun equals(other: A) = true } class C @JvmInline value class B1(val x: A) @JvmInline value class B2(val x: A?) @JvmInline value class D1(val x: C) { operator fun equals(other: D1) = true } @JvmInline value class D2(val x: C?) { operator fun equals(other: D2) = true } @JvmInline value class E1(val x: D1) @JvmInline value class E2(val x: D2) @JvmInline value class F(val x: T) @JvmInline value class G(val x: T) @JvmInline value class H(val x: F) fun box(): String { if (E1(D1(C())) != E1(D1(C()))) return "Fail 1" if (E2(D2(C())) != E2(D2(C()))) return "Fail 2.1" if (E2(D2(null)) != E2(D2(C()))) return "Fail 2.2" if (E2(D2(C())) != E2(D2(null))) return "Fail 2.3" if (E2(D2(null)) != E2(D2(null))) return "Fail 2.4" if (B1(A(0)) != B1(A(5))) return "Fail 3" if (B2(A(0)) != B2(A(5))) return "Fail 4.1" if (B2(null) == B2(A(5))) return "Fail 4.2" if (B2(A(0)) == B2(null)) return "Fail 4.3" if (B2(null) != B2(null)) return "Fail 4.4" if (F(D1(C())) != F(D1(C()))) return "Fail 5" if (G(D1(C())) != G(D1(C()))) return "Fail 6" if (H(F(1)) == H(F(2))) return "Fail 7" return "OK" }