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 type = left.type.unboxInlineClass()
|
||||||
|
|
||||||
val typedEqualsStaticReplacement = findStaticReplacementForTypedEquals(valueClass)
|
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 {
|
function.body = context.createIrBuilder(valueClass.symbol).run {
|
||||||
irExprBody(
|
irExprBody(
|
||||||
@@ -515,13 +515,6 @@ private class JvmInlineClassLowering(context: JvmBackendContext) : JvmValueClass
|
|||||||
valueClass.declarations += function
|
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? {
|
private fun findStaticReplacementForTypedEquals(valueClass: IrClass): IrFunction? {
|
||||||
fun isTypedEquals(irFunction: IrFunction): Boolean {
|
fun isTypedEquals(irFunction: IrFunction): Boolean {
|
||||||
return irFunction.run {
|
return irFunction.run {
|
||||||
|
|||||||
@@ -1304,3 +1304,7 @@ fun IrBuiltIns.getKFunctionType(returnType: IrType, parameterTypes: List<IrType>
|
|||||||
|
|
||||||
fun IdSignature?.isComposite(): Boolean =
|
fun IdSignature?.isComposite(): Boolean =
|
||||||
this is IdSignature.CompositeSignature
|
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() =
|
fun box() =
|
||||||
if (IC1(1.0) == IC1(1.05) && IC1(1.0) != IC1(1.2)
|
if (IC1(1.0) == IC1(1.05) && IC1(1.0) != IC1(1.2)
|
||||||
&& IC2(5) == IC2(6) && IC2(5) != IC2(7)
|
&& IC2(5) == IC2(6) && IC2(5) != IC2(7)
|
||||||
|
|||||||
Reference in New Issue
Block a user