This commit is contained in:
Igor Chevdar
2020-03-05 18:35:49 +03:00
parent be9d49dc7e
commit bc7c123d50
3 changed files with 22 additions and 7 deletions
@@ -14,7 +14,6 @@ import org.jetbrains.kotlin.backend.common.lower.irNot
import org.jetbrains.kotlin.backend.konan.*
import org.jetbrains.kotlin.backend.konan.ir.containsNull
import org.jetbrains.kotlin.backend.konan.ir.isSubtypeOf
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.descriptors.IrBuiltinOperatorDescriptor
@@ -26,6 +25,7 @@ import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.types.makeNullable
import org.jetbrains.kotlin.ir.builders.irGet
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.isNothing
@@ -39,7 +39,6 @@ import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
*/
internal class BuiltinOperatorLowering(val context: Context) : FileLoweringPass, IrBuildingTransformer(context) {
private val builtIns = context.builtIns
private val irBuiltins = context.irModule!!.irBuiltins
private val symbols = context.ir.symbols
@@ -135,11 +134,7 @@ internal class BuiltinOperatorLowering(val context: Context) : FileLoweringPass,
val equals = irClass.simpleFunctions()
.single { it.name.asString() == "equals" && it.valueParameters.size == 1 && it.overrides(anyEquals) }
// Note: this is not absolutely correct for inline class from other module
// since custom equals implementation can be added after compilation but before linking.
// TODO: reimplement after inline classes get properly designed `equals` operator.
// see https://youtrack.jetbrains.com/issue/KT-26354.
return equals.descriptor.kind == CallableMemberDescriptor.Kind.SYNTHESIZED
return equals.origin == IrDeclarationOrigin.GENERATED_INLINE_CLASS_MEMBER
}
fun IrBuilderWithScope.genInlineClassEquals(
+4
View File
@@ -3008,6 +3008,10 @@ task inlineClass0(type: KonanLocalTest) {
source = "codegen/inlineClass/inlineClass0.kt"
}
task inlineClass_customEquals(type: KonanLocalTest) {
source = "codegen/inlineClass/customEquals.kt"
}
task deserialized_inline0(type: KonanLocalTest) {
source = "serialization/deserialized_inline0.kt"
}
@@ -0,0 +1,16 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the LICENSE file.
*/
@file:Suppress("RESERVED_MEMBER_INSIDE_INLINE_CLASS")
package codegen.inlineClass.customEquals
import kotlin.test.*
private inline class Z(val data: Int) {
override fun equals(other: Any?) = other is Z && data % 256 == other.data % 256
}
@Test fun runTest() {
assertTrue(Z(0) == Z(256))
}