diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/builtinSpecialBridges.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/builtinSpecialBridges.kt index 2501835bc86..fbb0daad1d5 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/builtinSpecialBridges.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/builtinSpecialBridges.kt @@ -89,8 +89,8 @@ object BuiltinSpecialBridgesUtil { val bridges: MutableSet> = mutableSetOf() val superImplementationDescriptor = - if (specialBridge != null) - findSuperImplementationForStubDelegation(function, fake, isBodyOwner, signatureByDescriptor) + if (specialBridge != null && fake && !functionHandle.isAbstract) + findSuperImplementationForStubDelegation(function, isBodyOwner, signatureByDescriptor) else null @@ -140,17 +140,21 @@ object BuiltinSpecialBridgesUtil { */ private fun findSuperImplementationForStubDelegation( function: FunctionDescriptor, - fake: Boolean, isBodyOwner: (DeclarationDescriptor) -> Boolean, signatureByDescriptor: (FunctionDescriptor) -> Signature ): FunctionDescriptor? { - if (function.modality != Modality.OPEN || !fake) return null val implementation = findConcreteSuperDeclaration(DescriptorBasedFunctionHandle(function, isBodyOwner)).descriptor + + // Implementation from interface will be generated by common mechanism if (DescriptorUtils.isInterface(implementation.containingDeclaration)) return null // Implementation in super-class already has proper signature if (signatureByDescriptor(function) == signatureByDescriptor(implementation)) return null + assert(function.modality == Modality.OPEN) { + "Should generate stubs only for non-abstract built-ins, but ${function.name} is ${function.modality}" + } + return implementation }