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 5f6af44a994..0a5222bfe01 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 @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.backend.konan.PrimitiveBinaryType import org.jetbrains.kotlin.backend.konan.RuntimeNames import org.jetbrains.kotlin.backend.konan.ir.* import org.jetbrains.kotlin.backend.konan.isObjCMetaClass +import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.UnsignedType import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Modality @@ -751,6 +752,9 @@ private fun KotlinStubs.mapBlockType( private fun KotlinStubs.mapType(type: IrType, retained: Boolean, variadic: Boolean, location: TypeLocation): ValuePassing = mapType(type, retained, variadic, location, { reportUnsupportedType(it, type, location) }) +private fun IrType.isTypeOfNullLiteral(): Boolean = this is IrSimpleType && hasQuestionMark + && classifier.isClassWithFqName(KotlinBuiltIns.FQ_NAMES.nothing) + private fun KotlinStubs.mapType( type: IrType, retained: Boolean, @@ -770,6 +774,7 @@ private fun KotlinStubs.mapType( type.isFloat() -> TrivialValuePassing(irBuiltIns.floatType, CTypes.float) type.isDouble() -> TrivialValuePassing(irBuiltIns.doubleType, CTypes.double) type.classifierOrNull == symbols.interopCPointer -> TrivialValuePassing(type, CTypes.voidPtr) + type.isTypeOfNullLiteral() && variadic -> TrivialValuePassing(symbols.interopCPointer.typeWithStarProjections.makeNullable(), CTypes.voidPtr) type.isUByte() -> UnsignedValuePassing(type, CTypes.signedChar, CTypes.unsignedChar) type.isUShort() -> UnsignedValuePassing(type, CTypes.short, CTypes.unsignedShort) type.isUInt() -> UnsignedValuePassing(type, CTypes.int, CTypes.unsignedInt) diff --git a/backend.native/tests/interop/basics/callbacksAndVarargs.kt b/backend.native/tests/interop/basics/callbacksAndVarargs.kt index cf94a4f0a75..a88d12c9cc0 100644 --- a/backend.native/tests/interop/basics/callbacksAndVarargs.kt +++ b/backend.native/tests/interop/basics/callbacksAndVarargs.kt @@ -31,7 +31,8 @@ fun main(args: Array) { 111u, ULong.MAX_VALUE, E.TWO, - cValue { x = 15 } + cValue { x = 15 }, + null ).useContents { assertEquals(1, a1) assertEquals(2.toByte(), a2) @@ -47,5 +48,6 @@ fun main(args: Array) { assertEquals(ULong.MAX_VALUE, a12) assertEquals(E.TWO, a13) assertEquals(15, a14.x) + assertEquals(null, a15) } } diff --git a/backend.native/tests/interop/basics/ccallbacksAndVarargs.def b/backend.native/tests/interop/basics/ccallbacksAndVarargs.def index c808d5023ac..e6b2038430f 100644 --- a/backend.native/tests/interop/basics/ccallbacksAndVarargs.def +++ b/backend.native/tests/interop/basics/ccallbacksAndVarargs.def @@ -43,6 +43,7 @@ struct Args { unsigned long long a12; enum E a13; struct S a14; + void* a15; }; static struct Args getVarargs(int ignore, ...) { @@ -63,10 +64,11 @@ static struct Args getVarargs(int ignore, ...) { va_arg(args, unsigned int), va_arg(args, unsigned long long), va_arg(args, enum E), - va_arg(args, struct S) + va_arg(args, struct S), + va_arg(args, void*) }; va_end(args); return result; -} \ No newline at end of file +}