From 46a85d97291a3bc75db2d2b55767985571bb7203 Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Thu, 19 Jan 2023 09:31:21 +0100 Subject: [PATCH] Native: add a test for cinterop forward declarations --- .../backend.native/tests/build.gradle | 10 +++++ .../cForwardDeclarations.def | 11 +++++ .../forwardDeclarations.kt | 45 +++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 kotlin-native/backend.native/tests/interop/forwardDeclarations/cForwardDeclarations.def create mode 100644 kotlin-native/backend.native/tests/interop/forwardDeclarations/forwardDeclarations.kt diff --git a/kotlin-native/backend.native/tests/build.gradle b/kotlin-native/backend.native/tests/build.gradle index 5c26cddd7f1..ee7fd2f0a76 100644 --- a/kotlin-native/backend.native/tests/build.gradle +++ b/kotlin-native/backend.native/tests/build.gradle @@ -4372,6 +4372,10 @@ createInterop("workerSignals") { it.extraOpts "-Xcompile-source", "$projectDir/interop/workerSignals/workerSignals.cpp" } +createInterop("cForwardDeclarations") { + it.defFile "interop/forwardDeclarations/cForwardDeclarations.def" +} + if (PlatformInfo.isAppleTarget(project)) { createInterop("objcSmoke") { it.defFile 'interop/objc/objcSmoke.def' @@ -4905,6 +4909,12 @@ interopTest("interop_workerSignals") { interop = "workerSignals" } +interopTest("interop_forwardDeclarations") { + disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. + source = "interop/forwardDeclarations/forwardDeclarations.kt" + interop = "cForwardDeclarations" +} + /* TODO: This test isn't run automatically task interop_echo_server(type: RunInteropKonanTest) { diff --git a/kotlin-native/backend.native/tests/interop/forwardDeclarations/cForwardDeclarations.def b/kotlin-native/backend.native/tests/interop/forwardDeclarations/cForwardDeclarations.def new file mode 100644 index 00000000000..b46315998e8 --- /dev/null +++ b/kotlin-native/backend.native/tests/interop/forwardDeclarations/cForwardDeclarations.def @@ -0,0 +1,11 @@ +--- +struct StructDeclared; +struct StructDefined { int x; }; + +int useStructDeclared(struct StructDeclared* declared) { + return -1; +} + +int useStructDefined(struct StructDefined* defined) { + return -2; +} diff --git a/kotlin-native/backend.native/tests/interop/forwardDeclarations/forwardDeclarations.kt b/kotlin-native/backend.native/tests/interop/forwardDeclarations/forwardDeclarations.kt new file mode 100644 index 00000000000..e359f015fb3 --- /dev/null +++ b/kotlin-native/backend.native/tests/interop/forwardDeclarations/forwardDeclarations.kt @@ -0,0 +1,45 @@ +// This test mostly checks frontend behaviour. + +import cForwardDeclarations.* + +// Note: there are no practical cases for this type, but it works in K1 so better to have a test for this. +import cnames.structs.StructUndeclared + +import kotlin.test.assertEquals +import kotlinx.cinterop.COpaque +import kotlinx.cinterop.CStructVar +import kotlinx.cinterop.ptr +// The test should also check that these references can't be resolved, but the test infra doesn't support this yet: +// import cForwardDeclarations.StructUndeclared + +fun checkSubtype2() {} +fun checkSubtype3() {} +fun checkSubtype4() {} + +// Here we rely on frontend reporting conflicting overloads if some of these types turn out to be the same. +fun checkDifferentTypes(s: StructUndeclared?) = 0 +fun checkDifferentTypes(s: StructDeclared?) = 1 +fun checkDifferentTypes(s: StructDefined?) = 2 + +fun main() { + // Checking it is the same type: + checkSubtype3() + checkSubtype2() + + checkSubtype4() + checkSubtype2() + + checkSubtype4() + checkSubtype2() + + val undeclared: StructUndeclared? = null + val declared: StructDeclared? = null + val defined: StructDefined? = null + + assertEquals(0, checkDifferentTypes(undeclared)) + assertEquals(1, checkDifferentTypes(declared)) + assertEquals(2, checkDifferentTypes(defined)) + + assertEquals(-1, useStructDeclared(declared?.ptr)) + assertEquals(-2, useStructDefined(defined?.ptr)) +}