diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ObjCInterop.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ObjCInterop.kt index ef1ab57a292..016c058d50d 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ObjCInterop.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ObjCInterop.kt @@ -133,12 +133,19 @@ class ObjCOverridabilityCondition : ExternalOverridabilityCondition { assert(superDescriptor.name == subDescriptor.name) val superClass = superDescriptor.containingDeclaration as? ClassDescriptor - if (superClass == null || !superClass.isObjCClass()) { + val subClass = subDescriptor.containingDeclaration as? ClassDescriptor + + if (superClass == null || !superClass.isObjCClass() || subClass == null) { return ExternalOverridabilityCondition.Result.UNKNOWN } return if (areSelectorsEqual(superDescriptor, subDescriptor)) { - ExternalOverridabilityCondition.Result.OVERRIDABLE + // Also check the method signatures if the subclass is user-defined: + if (subClass.isExternalObjCClass()) { + ExternalOverridabilityCondition.Result.OVERRIDABLE + } else { + ExternalOverridabilityCondition.Result.UNKNOWN + } } else { ExternalOverridabilityCondition.Result.INCOMPATIBLE } diff --git a/backend.native/tests/interop/objc/smoke.kt b/backend.native/tests/interop/objc/smoke.kt index f27991f76ef..0464a90d1ee 100644 --- a/backend.native/tests/interop/objc/smoke.kt +++ b/backend.native/tests/interop/objc/smoke.kt @@ -48,8 +48,8 @@ fun MutablePairProtocol.swap() { } class Bar : Foo() { - override fun helloWithPrinter(printer: PrinterProtocol) = memScoped { - printer.print("Hello from Kotlin".cstr.getPointer(memScope)) + override fun helloWithPrinter(printer: PrinterProtocol?) = memScoped { + printer!!.print("Hello from Kotlin".cstr.getPointer(memScope)) } }