diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanLoweringPhases.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanLoweringPhases.kt index cab123428dd..a56b1115878 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanLoweringPhases.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanLoweringPhases.kt @@ -243,7 +243,7 @@ internal val interopPhase = makeKonanFileLoweringPhase( ::InteropLowering, name = "Interop", description = "Interop lowering", - prerequisite = setOf(inlinePhase, localFunctionsPhase) + prerequisite = setOf(inlinePhase, localFunctionsPhase, callableReferencePhase) ) internal val varargPhase = makeKonanFileLoweringPhase( diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGen.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGen.kt index 294f8e5bcc8..2a7691de382 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGen.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGen.kt @@ -42,6 +42,7 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.backend.konan.getObjCMethodInfo +import org.jetbrains.kotlin.backend.konan.lower.CallableReferenceLowering import org.jetbrains.kotlin.ir.descriptors.* internal interface KotlinStubs { @@ -261,6 +262,10 @@ private fun KotlinToCCallBuilder.handleArgumentForVarargParameter( } else { stubs.throwCompilerError(initializer, "unexpected initializer") } + } else if (variable is IrValueParameter && CallableReferenceLowering.isLoweredCallableReference(variable)) { + val location = variable.parent // Parameter itself has incorrect location. + val kind = if (this.isObjCMethod) "Objective-C methods" else "C functions" + stubs.reportError(location, "callable references to variadic $kind are not supported") } else { stubs.throwCompilerError(variable, "unexpected value declaration") } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/CallableReferenceLowering.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/CallableReferenceLowering.kt index 7dd3eb70ae3..d425922d067 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/CallableReferenceLowering.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/CallableReferenceLowering.kt @@ -41,6 +41,11 @@ internal class CallableReferenceLowering(val context: Context): FileLoweringPass private object DECLARATION_ORIGIN_FUNCTION_REFERENCE_IMPL : IrDeclarationOriginImpl("FUNCTION_REFERENCE_IMPL") + companion object { + fun isLoweredCallableReference(declaration: IrDeclaration): Boolean = + declaration.origin == DECLARATION_ORIGIN_FUNCTION_REFERENCE_IMPL + } + private val kTypeGenerator = KTypeGenerator(context) override fun lower(irFile: IrFile) {