Fix exception on 'equals()' returning 'Nothing' in inline class
^KT-54401: Fixed
This commit is contained in:
committed by
teamcity
parent
4c6b433496
commit
cc1b4243dd
+1
-8
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user