diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java index 60ac102242c..169197ab5f2 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java @@ -22613,6 +22613,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr runTest("compiler/testData/codegen/box/inlineClasses/kt54656.kt"); } + @Test + @TestMetadata("kt57242.kt") + public void testKt57242() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt57242.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal()); + } + @Test @TestMetadata("lateinitInlineClasses.kt") public void testLateinitInlineClasses() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java index 5df46e5f2a8..489c6ceda1e 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java @@ -22613,6 +22613,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo runTest("compiler/testData/codegen/box/inlineClasses/kt54656.kt"); } + @Test + @TestMetadata("kt57242.kt") + public void testKt57242() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt57242.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal()); + } + @Test @TestMetadata("lateinitInlineClasses.kt") public void testLateinitInlineClasses() throws Exception { diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/JvmInlineClassLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/JvmInlineClassLowering.kt index 523dfdd3fe2..2d5a80f32ef 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/JvmInlineClassLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/JvmInlineClassLowering.kt @@ -283,11 +283,11 @@ internal class JvmInlineClassLowering( if (left.type.isUnsigned() && right.type.isUnsigned() && rightIsUnboxed) return irEquals(left.coerceToUnboxed(), right.coerceToUnboxed()) - val klass = left.type.classOrNull!!.owner - val equalsMethod = if (rightIsUnboxed) { - this@JvmInlineClassLowering.context.inlineClassReplacements.getSpecializedEqualsMethod(klass, context.irBuiltIns) + val leftOperandClass = left.type.classOrNull!!.owner + val equalsMethod = if (rightIsUnboxed && leftOperandClass == right.type.classOrNull!!.owner) { + this@JvmInlineClassLowering.context.inlineClassReplacements.getSpecializedEqualsMethod(leftOperandClass, context.irBuiltIns) } else { - val equals = klass.functions.single { it.name.asString() == "equals" && it.overriddenSymbols.isNotEmpty() } + val equals = leftOperandClass.functions.single { it.name.asString() == "equals" && it.overriddenSymbols.isNotEmpty() } this@JvmInlineClassLowering.context.inlineClassReplacements.getReplacementFunction(equals)!! } diff --git a/compiler/testData/codegen/box/inlineClasses/kt57242.kt b/compiler/testData/codegen/box/inlineClasses/kt57242.kt new file mode 100644 index 00000000000..4ba0342255f --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/kt57242.kt @@ -0,0 +1,24 @@ +// TARGET_BACKEND: JVM_IR +// WITH_STDLIB +// FULL_JDK +// WORKS_WHEN_VALUE_CLASS +// LANGUAGE: +ValueClasses + +import java.util.UUID +import java.util.UUID.randomUUID + +OPTIONAL_JVM_INLINE_ANNOTATION +value class IdOne(val id: UUID) + +OPTIONAL_JVM_INLINE_ANNOTATION +value class IdTwo(val id: UUID) + +fun box(): String { + val sameUUID = randomUUID() + val one = IdOne(sameUUID) + val two = IdTwo(sameUUID) + + if (one.equals(two)) return "Fail" + + return "OK" +} \ No newline at end of file diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index c5a3161c0b0..76150549d7e 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -22613,6 +22613,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/inlineClasses/kt54656.kt"); } + @Test + @TestMetadata("kt57242.kt") + public void testKt57242() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt57242.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal()); + } + @Test @TestMetadata("lateinitInlineClasses.kt") public void testLateinitInlineClasses() throws Exception {