diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/linkage/partial/IrUnimplementedOverridesStrategy.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/linkage/partial/IrUnimplementedOverridesStrategy.kt index 47e9f127518..5ce37810107 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/linkage/partial/IrUnimplementedOverridesStrategy.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/linkage/partial/IrUnimplementedOverridesStrategy.kt @@ -7,20 +7,28 @@ package org.jetbrains.kotlin.backend.common.linkage.partial import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.ir.declarations.IrClass +import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin +import org.jetbrains.kotlin.ir.declarations.IrField import org.jetbrains.kotlin.ir.declarations.IrOverridableMember import org.jetbrains.kotlin.ir.linkage.partial.IrUnimplementedOverridesStrategy import org.jetbrains.kotlin.ir.linkage.partial.PartiallyLinkedDeclarationOrigin +import org.jetbrains.kotlin.ir.types.isNothing internal object ImplementAsErrorThrowingStubs : IrUnimplementedOverridesStrategy { override fun computeCustomization(overridableMember: T, parent: IrClass) = - if (overridableMember.modality == Modality.ABSTRACT - && parent.modality != Modality.ABSTRACT - && parent.modality != Modality.SEALED - ) { + if (overridableMember.isAbstract && parent.isConcrete && !parent.delegatesToNothing) { IrUnimplementedOverridesStrategy.Customization( origin = PartiallyLinkedDeclarationOrigin.UNIMPLEMENTED_ABSTRACT_CALLABLE_MEMBER, modality = parent.modality // Use modality of class for implemented callable member. ) - } else - IrUnimplementedOverridesStrategy.Customization.NO + } else IrUnimplementedOverridesStrategy.Customization.NO + + private val IrOverridableMember.isAbstract: Boolean + get() = modality == Modality.ABSTRACT + + private val IrClass.isConcrete: Boolean + get() = modality != Modality.ABSTRACT && modality != Modality.SEALED + + private val IrClass.delegatesToNothing: Boolean + get() = declarations.any { it is IrField && it.origin == IrDeclarationOrigin.DELEGATE && it.type.isNothing() } }