From 536086988c1f91d3aac75d8e8e1a24f380743552 Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Thu, 11 Apr 2019 14:20:53 +0200 Subject: [PATCH] cgo: implement Go arrays (constant arrays in C) --- loader/libclang.go | 10 ++++++++++ testdata/cgo/main.c | 1 + testdata/cgo/main.go | 2 ++ testdata/cgo/main.h | 1 + 4 files changed, 14 insertions(+) diff --git a/loader/libclang.go b/loader/libclang.go index 6f96d212..ea459085 100644 --- a/loader/libclang.go +++ b/loader/libclang.go @@ -268,6 +268,16 @@ func (info *fileInfo) makeASTType(typ C.CXType) ast.Expr { Star: info.importCPos, X: info.makeASTType(C.clang_getPointeeType(typ)), } + case C.CXType_ConstantArray: + return &ast.ArrayType{ + Lbrack: info.importCPos, + Len: &ast.BasicLit{ + ValuePos: info.importCPos, + Kind: token.INT, + Value: strconv.FormatInt(int64(C.clang_getArraySize(typ)), 10), + }, + Elt: info.makeASTType(C.clang_getElementType(typ)), + } case C.CXType_FunctionProto: // Be compatible with gc, which uses the *[0]byte type for function // pointer types. diff --git a/testdata/cgo/main.c b/testdata/cgo/main.c index e0942b0a..78a065f9 100644 --- a/testdata/cgo/main.c +++ b/testdata/cgo/main.c @@ -9,6 +9,7 @@ _Complex float globalComplexFloat = 4.1+3.3i; _Complex double globalComplexDouble = 4.2+3.4i; _Complex double globalComplexLongDouble = 4.3+3.5i; collection_t globalStruct = {256, -123456, 3.14}; +short globalArray[3] = {5, 6, 7}; int fortytwo() { return 42; diff --git a/testdata/cgo/main.go b/testdata/cgo/main.go index 604e749c..327d38dd 100644 --- a/testdata/cgo/main.go +++ b/testdata/cgo/main.go @@ -37,6 +37,8 @@ func main() { println("complex double:", C.globalComplexDouble) println("complex long double:", C.globalComplexLongDouble) println("struct:", C.globalStruct.s, C.globalStruct.l, C.globalStruct.f) + var _ [3]C.short = C.globalArray + println("array:", C.globalArray[0], C.globalArray[1], C.globalArray[2]) } //export mul diff --git a/testdata/cgo/main.h b/testdata/cgo/main.h index d384c3bc..61b2b343 100644 --- a/testdata/cgo/main.h +++ b/testdata/cgo/main.h @@ -21,6 +21,7 @@ extern _Complex float globalComplexFloat; extern _Complex double globalComplexDouble; extern _Complex double globalComplexLongDouble; extern collection_t globalStruct; +extern short globalArray[3]; // test duplicate definitions int add(int a, int b);