[Interop][Test] Add tests for unions
This commit is contained in:
committed by
Sergey Bogolepov
parent
9f9609ac0f
commit
47e505825e
@@ -3469,6 +3469,10 @@ createInterop("cmangling_keywords2") {
|
|||||||
it.defFile 'interop/basics/mangling_keywords2.def'
|
it.defFile 'interop/basics/mangling_keywords2.def'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
createInterop("cunion") {
|
||||||
|
it.defFile 'interop/basics/cunion.def'
|
||||||
|
}
|
||||||
|
|
||||||
createInterop("auxiliaryCppSources") {
|
createInterop("auxiliaryCppSources") {
|
||||||
// We need to provide empty def file to create correct `KonanInteropTask`.
|
// We need to provide empty def file to create correct `KonanInteropTask`.
|
||||||
it.defFile 'interop/auxiliary_sources/auxiliaryCppSources.def'
|
it.defFile 'interop/auxiliary_sources/auxiliaryCppSources.def'
|
||||||
@@ -3718,6 +3722,12 @@ interopTest("interop_withSpaces") {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interopTest("interop_union") {
|
||||||
|
disabled = (project.testTarget == 'wasm32') // No interop for wasm yet.
|
||||||
|
interop = 'cunion'
|
||||||
|
source = "interop/basics/union.kt"
|
||||||
|
}
|
||||||
|
|
||||||
task interop_convert(type: KonanLocalTest) {
|
task interop_convert(type: KonanLocalTest) {
|
||||||
source = "codegen/intrinsics/interop_convert.kt"
|
source = "codegen/intrinsics/interop_convert.kt"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
---
|
||||||
|
typedef union {
|
||||||
|
short s;
|
||||||
|
long long ll;
|
||||||
|
} BasicUnion;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
union {
|
||||||
|
int i;
|
||||||
|
float f;
|
||||||
|
} as;
|
||||||
|
} StructWithUnion;
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
unsigned int i : 31;
|
||||||
|
unsigned char b : 1;
|
||||||
|
} Packed;
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
import cunion.*
|
||||||
|
import kotlinx.cinterop.*
|
||||||
|
import kotlin.test.*
|
||||||
|
|
||||||
|
fun main() {
|
||||||
|
memScoped {
|
||||||
|
val basicUnion = alloc<BasicUnion>()
|
||||||
|
for (value in Short.MIN_VALUE..Short.MAX_VALUE) {
|
||||||
|
basicUnion.ll = value.toLong()
|
||||||
|
assertEquals(value.toShort(), basicUnion.s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
memScoped {
|
||||||
|
val struct = alloc<StructWithUnion>()
|
||||||
|
struct.`as`.i = Float.NaN.toRawBits()
|
||||||
|
assertEquals(Float.NaN, struct.`as`.f)
|
||||||
|
}
|
||||||
|
memScoped {
|
||||||
|
val union = alloc<Packed>()
|
||||||
|
union.b = 1u
|
||||||
|
assertEquals(1u, union.i)
|
||||||
|
union.i = 0u
|
||||||
|
assertEquals(0u, union.b)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user