From bc7c123d50f2616945ff77cccf85454d37dec66a Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Thu, 5 Mar 2020 18:35:49 +0300 Subject: [PATCH] [IR] Fix for https://youtrack.jetbrains.com/issue/KT-37057 + test --- .../konan/lower/BuiltinOperatorLowering.kt | 9 ++------- backend.native/tests/build.gradle | 4 ++++ .../tests/codegen/inlineClass/customEquals.kt | 16 ++++++++++++++++ 3 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 backend.native/tests/codegen/inlineClass/customEquals.kt diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BuiltinOperatorLowering.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BuiltinOperatorLowering.kt index 369c9968f81..3f355d23f52 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BuiltinOperatorLowering.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BuiltinOperatorLowering.kt @@ -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( diff --git a/backend.native/tests/build.gradle b/backend.native/tests/build.gradle index fb968934f2d..a8b927a3132 100644 --- a/backend.native/tests/build.gradle +++ b/backend.native/tests/build.gradle @@ -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" } diff --git a/backend.native/tests/codegen/inlineClass/customEquals.kt b/backend.native/tests/codegen/inlineClass/customEquals.kt new file mode 100644 index 00000000000..03b447b43d3 --- /dev/null +++ b/backend.native/tests/codegen/inlineClass/customEquals.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)) +}