Fix exception on 'equals()' returning 'Nothing' in inline class

^KT-54401: Fixed
This commit is contained in:
vladislav.grechko
2022-10-13 18:40:58 +02:00
committed by teamcity
parent 4c6b433496
commit cc1b4243dd
3 changed files with 10 additions and 8 deletions
@@ -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 {
@@ -1304,3 +1304,7 @@ fun IrBuiltIns.getKFunctionType(returnType: IrType, parameterTypes: List<IrType>
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
@@ -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)