[IR] Fix for https://youtrack.jetbrains.com/issue/KT-37057 + test
This commit is contained in:
+2
-7
@@ -14,7 +14,6 @@ import org.jetbrains.kotlin.backend.common.lower.irNot
|
|||||||
import org.jetbrains.kotlin.backend.konan.*
|
import org.jetbrains.kotlin.backend.konan.*
|
||||||
import org.jetbrains.kotlin.backend.konan.ir.containsNull
|
import org.jetbrains.kotlin.backend.konan.ir.containsNull
|
||||||
import org.jetbrains.kotlin.backend.konan.ir.isSubtypeOf
|
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.builders.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||||
import org.jetbrains.kotlin.ir.descriptors.IrBuiltinOperatorDescriptor
|
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.types.makeNullable
|
||||||
import org.jetbrains.kotlin.ir.builders.irGet
|
import org.jetbrains.kotlin.ir.builders.irGet
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
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.symbols.IrFunctionSymbol
|
||||||
import org.jetbrains.kotlin.ir.types.IrType
|
import org.jetbrains.kotlin.ir.types.IrType
|
||||||
import org.jetbrains.kotlin.ir.types.isNothing
|
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) {
|
internal class BuiltinOperatorLowering(val context: Context) : FileLoweringPass, IrBuildingTransformer(context) {
|
||||||
|
|
||||||
private val builtIns = context.builtIns
|
|
||||||
private val irBuiltins = context.irModule!!.irBuiltins
|
private val irBuiltins = context.irModule!!.irBuiltins
|
||||||
private val symbols = context.ir.symbols
|
private val symbols = context.ir.symbols
|
||||||
|
|
||||||
@@ -135,11 +134,7 @@ internal class BuiltinOperatorLowering(val context: Context) : FileLoweringPass,
|
|||||||
val equals = irClass.simpleFunctions()
|
val equals = irClass.simpleFunctions()
|
||||||
.single { it.name.asString() == "equals" && it.valueParameters.size == 1 && it.overrides(anyEquals) }
|
.single { it.name.asString() == "equals" && it.valueParameters.size == 1 && it.overrides(anyEquals) }
|
||||||
|
|
||||||
// Note: this is not absolutely correct for inline class from other module
|
return equals.origin == IrDeclarationOrigin.GENERATED_INLINE_CLASS_MEMBER
|
||||||
// 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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun IrBuilderWithScope.genInlineClassEquals(
|
fun IrBuilderWithScope.genInlineClassEquals(
|
||||||
|
|||||||
@@ -3008,6 +3008,10 @@ task inlineClass0(type: KonanLocalTest) {
|
|||||||
source = "codegen/inlineClass/inlineClass0.kt"
|
source = "codegen/inlineClass/inlineClass0.kt"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
task inlineClass_customEquals(type: KonanLocalTest) {
|
||||||
|
source = "codegen/inlineClass/customEquals.kt"
|
||||||
|
}
|
||||||
|
|
||||||
task deserialized_inline0(type: KonanLocalTest) {
|
task deserialized_inline0(type: KonanLocalTest) {
|
||||||
source = "serialization/deserialized_inline0.kt"
|
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))
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user