[K/N] Add tests for flexible arrays in interop
^KT-48074
This commit is contained in:
@@ -38,4 +38,28 @@ struct Complex produceComplex() {
|
|||||||
.b = 1
|
.b = 1
|
||||||
};
|
};
|
||||||
return complex;
|
return complex;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct WithFlexibleArray {
|
||||||
|
int size;
|
||||||
|
int data[];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct WithFlexibleArrayWithPadding {
|
||||||
|
int size;
|
||||||
|
char c;
|
||||||
|
long long data[];
|
||||||
|
};
|
||||||
|
|
||||||
|
void fillArray(struct WithFlexibleArrayWithPadding *flex, int count) {
|
||||||
|
flex->size = count;
|
||||||
|
flex->c = '!';
|
||||||
|
for (int i = 0; i < count; i++) {
|
||||||
|
flex->data[i] = (((long long)i) << 32) | (i * 100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct WithZeroSizedArray {
|
||||||
|
int size;
|
||||||
|
int data[0];
|
||||||
};
|
};
|
||||||
@@ -63,6 +63,49 @@ fun main() {
|
|||||||
// Check that generics doesn't break anything.
|
// Check that generics doesn't break anything.
|
||||||
checkEnumSubTyping(E.R)
|
checkEnumSubTyping(E.R)
|
||||||
checkIntSubTyping(630090)
|
checkIntSubTyping(630090)
|
||||||
|
|
||||||
|
memScoped {
|
||||||
|
val SIZE = 10
|
||||||
|
val flex = alloc(sizeOf<WithFlexibleArray>() + sizeOf<IntVar>() * SIZE, alignOf<WithFlexibleArray>()).reinterpret<WithFlexibleArray>()
|
||||||
|
flex.size = SIZE
|
||||||
|
for (i in 0 until SIZE) {
|
||||||
|
flex.data[i] = i
|
||||||
|
}
|
||||||
|
assertEquals(SIZE, flex.size)
|
||||||
|
for (i in 0 until SIZE) {
|
||||||
|
assertEquals(i, flex.data[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
memScoped {
|
||||||
|
val SIZE = 10
|
||||||
|
val flex = alloc(sizeOf<WithZeroSizedArray>() + sizeOf<IntVar>() * SIZE, alignOf<WithZeroSizedArray>()).reinterpret<WithZeroSizedArray>()
|
||||||
|
assertEquals(4, sizeOf<WithZeroSizedArray>())
|
||||||
|
assertEquals(4, alignOf<WithZeroSizedArray>())
|
||||||
|
flex.size = SIZE
|
||||||
|
for (i in 0 until SIZE) {
|
||||||
|
flex.data[i] = i
|
||||||
|
}
|
||||||
|
assertEquals(SIZE, flex.size)
|
||||||
|
for (i in 0 until SIZE) {
|
||||||
|
assertEquals(i, flex.data[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
memScoped {
|
||||||
|
val SIZE = 10
|
||||||
|
assertEquals(8, sizeOf<WithFlexibleArrayWithPadding>())
|
||||||
|
assertEquals(8, alignOf<WithFlexibleArrayWithPadding>())
|
||||||
|
val flex = alloc(sizeOf<WithFlexibleArrayWithPadding>() + sizeOf<LongVar>() * SIZE, alignOf<WithFlexibleArrayWithPadding>())
|
||||||
|
.reinterpret<WithFlexibleArrayWithPadding>()
|
||||||
|
fillArray(flex.ptr, SIZE)
|
||||||
|
assertEquals(SIZE, flex.size)
|
||||||
|
assertEquals('!'.code.toByte(), flex.c);
|
||||||
|
for (i in 0 until SIZE) {
|
||||||
|
assertEquals((i.toLong() shl 32) or (i.toLong() * 100), flex.data[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun <T : E> checkEnumSubTyping(e: T) = memScoped {
|
fun <T : E> checkEnumSubTyping(e: T) = memScoped {
|
||||||
|
|||||||
Reference in New Issue
Block a user