diff --git a/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/Indexer.kt b/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/Indexer.kt index 17c7d2f9700..cc5197a99a7 100644 --- a/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/Indexer.kt +++ b/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/Indexer.kt @@ -522,14 +522,19 @@ internal class NativeIndexImpl(val library: NativeLibrary, val verbose: Boolean } CXType_ConstantArray -> { - val elemType = convertType(clang_getArrayElementType(type)) + val elementType = convertType(clang_getArrayElementType(type)) val length = clang_getArraySize(type) - ConstArrayType(elemType, length) + ConstArrayType(elementType, length) } CXType_IncompleteArray -> { - val elemType = convertType(clang_getArrayElementType(type)) - IncompleteArrayType(elemType) + val elementType = convertType(clang_getArrayElementType(type)) + IncompleteArrayType(elementType) + } + + CXType_VariableArray -> { + val elementType = convertType(clang_getArrayElementType(type)) + VariableArrayType(elementType) } CXType_FunctionProto -> { diff --git a/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/NativeIndex.kt b/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/NativeIndex.kt index 527c056482d..b36dbc8ba35 100644 --- a/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/NativeIndex.kt +++ b/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/NativeIndex.kt @@ -266,6 +266,7 @@ interface ArrayType : Type { data class ConstArrayType(override val elemType: Type, val length: Long) : ArrayType data class IncompleteArrayType(override val elemType: Type) : ArrayType +data class VariableArrayType(override val elemType: Type) : ArrayType data class Typedef(val def: TypedefDef) : Type diff --git a/backend.native/tests/interop/basics/ctypes.def b/backend.native/tests/interop/basics/ctypes.def index 181ab2d3be8..3b6cf0bee37 100644 --- a/backend.native/tests/interop/basics/ctypes.def +++ b/backend.native/tests/interop/basics/ctypes.def @@ -13,4 +13,39 @@ struct StructWithConstFields getStructWithConstFields() { enum ForwardDeclaredEnum; enum ForwardDeclaredEnum { ZERO, ONE, TWO -}; \ No newline at end of file +}; + +static int vlaSum(int size, int array[size]) { + int result = 0; + for (int i = 0; i < size; ++i) { + result += array[i]; + } + return result; +} + +static int vlaSum2D(int size, int array[][size]) { + int result = 0; + for (int i = 0; i < size; ++i) { + for (int j = 0; j < size; ++j) { + result += array[i][j]; + } + } + return result; +} + +static int vlaSum2DBothDimensions(int rows, int columns, int array[rows][columns]) { + int result = 0; + for (int i = 0; i < rows; ++i) { + for (int j = 0; j < columns; ++j) { + result += array[i][j]; + } + } + return result; +} + +/* +// Not supported by clang: +static int vlaSum2DForward(int size; int array[][size], int size) { + return vlaSum2D(size, array); +} +*/ \ No newline at end of file diff --git a/backend.native/tests/interop/basics/types.kt b/backend.native/tests/interop/basics/types.kt index 03b8bec2aa5..599afdf9dae 100644 --- a/backend.native/tests/interop/basics/types.kt +++ b/backend.native/tests/interop/basics/types.kt @@ -9,4 +9,11 @@ fun main() { } assertEquals(1u, ForwardDeclaredEnum.ONE.value) + + assertEquals(6, vlaSum(3, cValuesOf(1, 2, 3))) + assertEquals(10, vlaSum2D(2, cValuesOf(1, 2, 3, 4))) + assertEquals(21, vlaSum2DBothDimensions(2, 3, cValuesOf(1, 2, 3, 4, 5, 6))) + + // Not supported by clang: + // assertEquals(10, vlaSum2DForward(cValuesOf(1, 2, 3, 4), 2)) } \ No newline at end of file