diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/NewIrUtils.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/NewIrUtils.kt index c137861346e..fd77bbc148c 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/NewIrUtils.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/NewIrUtils.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.backend.konan.ir import org.jetbrains.kotlin.backend.common.atMostOne +import org.jetbrains.kotlin.backend.common.ir.isFinalClass import org.jetbrains.kotlin.backend.konan.DECLARATION_ORIGIN_INLINE_CLASS_SPECIAL_FUNCTION import org.jetbrains.kotlin.backend.konan.descriptors.allOverriddenFunctions import org.jetbrains.kotlin.backend.konan.descriptors.isInteropLibrary @@ -62,9 +63,6 @@ val IrFunction.isOverridable get() = this is IrSimpleFunction && this.isOverrida val IrFunction.isOverridableOrOverrides get() = this is IrSimpleFunction && (this.isOverridable || this.overriddenSymbols.isNotEmpty()) -val IrClass.isFinalClass: Boolean - get() = modality == Modality.FINAL - fun IrClass.isSpecialClassWithNoSupertypes() = this.isAny() || this.isNothing() inline fun IrDeclaration.getAnnotationArgumentValue(fqName: FqName, argumentName: String): T? { diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/KotlinObjCClassInfoGenerator.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/KotlinObjCClassInfoGenerator.kt index dda4bc7b035..6f0d66ef8d3 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/KotlinObjCClassInfoGenerator.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/KotlinObjCClassInfoGenerator.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.backend.konan.llvm import llvm.LLVMLinkage import llvm.LLVMSetLinkage import llvm.LLVMValueRef +import org.jetbrains.kotlin.backend.common.ir.isFinalClass import org.jetbrains.kotlin.backend.konan.* import org.jetbrains.kotlin.backend.konan.descriptors.getAnnotationStringValue import org.jetbrains.kotlin.backend.konan.ir.* diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt index 9777ef30254..cb96c680071 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt @@ -13,7 +13,6 @@ import org.jetbrains.kotlin.backend.konan.cgen.* import org.jetbrains.kotlin.backend.konan.descriptors.allOverriddenFunctions import org.jetbrains.kotlin.backend.konan.descriptors.synthesizedName import org.jetbrains.kotlin.backend.konan.ir.* -import org.jetbrains.kotlin.backend.konan.ir.isFinalClass import org.jetbrains.kotlin.backend.konan.llvm.IntrinsicType import org.jetbrains.kotlin.backend.konan.llvm.tryGetIntrinsicType import org.jetbrains.kotlin.backend.konan.serialization.resolveFakeOverrideMaybeAbstract diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/NativeAnnotationImplementationTransformer.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/NativeAnnotationImplementationTransformer.kt index bad190fbe70..a912153b15c 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/NativeAnnotationImplementationTransformer.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/NativeAnnotationImplementationTransformer.kt @@ -5,9 +5,9 @@ package org.jetbrains.kotlin.backend.konan.lower +import org.jetbrains.kotlin.backend.common.ir.isFinalClass import org.jetbrains.kotlin.backend.common.lower.AnnotationImplementationTransformer import org.jetbrains.kotlin.backend.konan.* -import org.jetbrains.kotlin.backend.konan.ir.isFinalClass import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.* diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DataFlowIR.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DataFlowIR.kt index 92fa838227e..7672c931e92 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DataFlowIR.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DataFlowIR.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.backend.konan.optimizations import org.jetbrains.kotlin.backend.konan.* import org.jetbrains.kotlin.backend.common.ir.allParameters +import org.jetbrains.kotlin.backend.common.ir.isFinalClass import org.jetbrains.kotlin.backend.konan.descriptors.* import org.jetbrains.kotlin.backend.konan.descriptors.OverriddenFunctionInfo import org.jetbrains.kotlin.backend.konan.descriptors.implementedInterfaces @@ -486,14 +487,12 @@ internal object DataFlowIR { }, data = null) } - private fun IrClass.isFinal() = modality == Modality.FINAL - fun mapClassReferenceType(irClass: IrClass): Type { // Do not try to devirtualize ObjC classes. if (irClass.module.name == Name.special("") || irClass.isObjCClass()) return Type.Virtual - val isFinal = irClass.isFinal() + val isFinal = irClass.isFinalClass val isAbstract = irClass.isAbstract() val name = irClass.fqNameForIrSerialization.asString() classMap[irClass]?.let { return it } @@ -638,7 +637,7 @@ internal object DataFlowIR { } val bridgeTargetSymbol = if (isSpecialBridge || bridgeTarget == null) null else mapFunction(bridgeTarget) val placeToFunctionsTable = !isAbstract && it !is IrConstructor && irClass != null - && (it.isOverridableOrOverrides || bridgeTarget != null || function.isSpecial || !irClass.isFinal()) + && (it.isOverridableOrOverrides || bridgeTarget != null || function.isSpecial || !irClass.isFinalClass) val symbolTableIndex = if (placeToFunctionsTable) module.numberOfFunctions++ else -1 val frozen = it is IrConstructor && irClass!!.isFrozen(context) val functionSymbol = if (it.isExported()) diff --git a/kotlin-native/backend.native/tests/build.gradle b/kotlin-native/backend.native/tests/build.gradle index 48d4d5d938f..ec3a395b52b 100644 --- a/kotlin-native/backend.native/tests/build.gradle +++ b/kotlin-native/backend.native/tests/build.gradle @@ -1362,6 +1362,12 @@ linkTest("enum_linkTest") { lib = "codegen/enum/linkTest_lib.kt" } +linkTest("enum_openMethodNoOverrides") { + useGoldenData = true + source = "codegen/enum/openMethodNoOverrides_main.kt" + lib = "codegen/enum/openMethodNoOverrides_lib.kt" +} + task enum_varargParam(type: KonanLocalTest) { useGoldenData = true source = "codegen/enum/varargParam.kt" diff --git a/kotlin-native/backend.native/tests/codegen/enum/openMethodNoOverrides_lib.kt b/kotlin-native/backend.native/tests/codegen/enum/openMethodNoOverrides_lib.kt new file mode 100644 index 00000000000..12b046c8841 --- /dev/null +++ b/kotlin-native/backend.native/tests/codegen/enum/openMethodNoOverrides_lib.kt @@ -0,0 +1,10 @@ +/* + * Copyright 2010-2022 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. + */ + +enum class Foo { + Z; + + open fun bar() = 42 +} \ No newline at end of file diff --git a/kotlin-native/backend.native/tests/codegen/enum/openMethodNoOverrides_main.kt b/kotlin-native/backend.native/tests/codegen/enum/openMethodNoOverrides_main.kt new file mode 100644 index 00000000000..7ebd4010253 --- /dev/null +++ b/kotlin-native/backend.native/tests/codegen/enum/openMethodNoOverrides_main.kt @@ -0,0 +1,6 @@ +/* + * Copyright 2010-2022 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. + */ + +fun main() = println(Foo.Z.bar()) \ No newline at end of file diff --git a/kotlin-native/backend.native/tests/codegen/enum/openMethodNoOverrides_main.out b/kotlin-native/backend.native/tests/codegen/enum/openMethodNoOverrides_main.out new file mode 100644 index 00000000000..d81cc0710eb --- /dev/null +++ b/kotlin-native/backend.native/tests/codegen/enum/openMethodNoOverrides_main.out @@ -0,0 +1 @@ +42