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 b7f447af268..8e70511d59d 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 @@ -486,7 +486,7 @@ private class JvmInlineClassLowering(context: JvmBackendContext) : JvmValueClass val type = left.type.unboxInlineClass() val typedEqualsStaticReplacement = findStaticReplacementForTypedEquals(valueClass) - val untypedEquals = valueClass.functions.single { overridesEqualsFromAny(it) } + val untypedEquals = valueClass.functions.single { it.overridesEqualsFromAny } function.body = context.createIrBuilder(valueClass.symbol).run { irExprBody( @@ -515,13 +515,6 @@ private class JvmInlineClassLowering(context: JvmBackendContext) : JvmValueClass valueClass.declarations += function } - private fun overridesEqualsFromAny(irFunction: IrFunction): Boolean { - return irFunction.run { - name == EQUALS && returnType.isBoolean() && valueParameters.size == 1 - && valueParameters[0].type.isNullableAny() && contextReceiverParametersCount == 0 && extensionReceiverParameter == null - } - } - private fun findStaticReplacementForTypedEquals(valueClass: IrClass): IrFunction? { fun isTypedEquals(irFunction: IrFunction): Boolean { return irFunction.run { diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt index f4f2b2a3867..d19cac8fb3b 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt @@ -1304,3 +1304,7 @@ fun IrBuiltIns.getKFunctionType(returnType: IrType, parameterTypes: List fun IdSignature?.isComposite(): Boolean = this is IdSignature.CompositeSignature + +val IrFunction.overridesEqualsFromAny + get() = name == OperatorNameConventions.EQUALS && valueParameters.size == 1 && valueParameters[0].type.isNullableAny() + && contextReceiverParametersCount == 0 && extensionReceiverParameter == null \ No newline at end of file diff --git a/compiler/testData/codegen/box/inlineClasses/inlineClassEqualsOverride.kt b/compiler/testData/codegen/box/inlineClasses/inlineClassEqualsOverride.kt index f582f9d070e..8cffe7e482b 100644 --- a/compiler/testData/codegen/box/inlineClasses/inlineClassEqualsOverride.kt +++ b/compiler/testData/codegen/box/inlineClasses/inlineClassEqualsOverride.kt @@ -28,6 +28,11 @@ value class IC3(val value: Int) { } +OPTIONAL_JVM_INLINE_ANNOTATION +value class IC4(val value: Int) { + override fun equals(other: Any?) = TODO() +} + fun box() = if (IC1(1.0) == IC1(1.05) && IC1(1.0) != IC1(1.2) && IC2(5) == IC2(6) && IC2(5) != IC2(7)