From d4beef6872392e5c6a49816fbcca727df70d0c3e Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Mon, 2 Nov 2020 16:20:22 +0300 Subject: [PATCH] Add trivial test for CStructVar declared in source code --- .../backend.native/tests/build.gradle | 4 ++ .../intrinsics/interop_sourceCodeStruct.kt | 40 +++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 kotlin-native/backend.native/tests/codegen/intrinsics/interop_sourceCodeStruct.kt diff --git a/kotlin-native/backend.native/tests/build.gradle b/kotlin-native/backend.native/tests/build.gradle index e344a821a69..1728c8ba0a5 100644 --- a/kotlin-native/backend.native/tests/build.gradle +++ b/kotlin-native/backend.native/tests/build.gradle @@ -4034,6 +4034,10 @@ task interop_convert(type: KonanLocalTest) { source = "codegen/intrinsics/interop_convert.kt" } +task interop_sourceCodeStruct(type: KonanLocalTest) { + source = "codegen/intrinsics/interop_sourceCodeStruct.kt" +} + /* TODO: This test isn't run automatically task interop_echo_server(type: RunInteropKonanTest) { diff --git a/kotlin-native/backend.native/tests/codegen/intrinsics/interop_sourceCodeStruct.kt b/kotlin-native/backend.native/tests/codegen/intrinsics/interop_sourceCodeStruct.kt new file mode 100644 index 00000000000..be891194f47 --- /dev/null +++ b/kotlin-native/backend.native/tests/codegen/intrinsics/interop_sourceCodeStruct.kt @@ -0,0 +1,40 @@ +package codegen.intrinsics.interop_sourceCodeStruct + +import kotlinx.cinterop.* +import kotlinx.cinterop.internal.* +import kotlin.test.* + +// Just making sure this doesn't get accidentally forbidden or otherwise broken. +// (however defining structs this way is still strongly discouraged, please define +// structs in C headers or .def files instead). + +@CStruct("struct { int p0; int p1; }") +class S(rawPtr: NativePtr) : CStructVar(rawPtr) { + + companion object : CStructVar.Type(8, 4) + + var x: Int + get() = memberAt(0).value + set(value) { + memberAt(0).value = value + } + + var y: Int + get() = memberAt(4).value + set(value) { + memberAt(4).value = value + } +} + +@Test +fun test() = memScoped { + val s = alloc() + + s.x = 123 + assertEquals(123, s.x) + assertEquals(123, s.ptr.reinterpret()[0]) + + s.y = 321 + assertEquals(321, s.y) + assertEquals(321, s.ptr.reinterpret()[1]) +}