diff options
author | Ayke van Laethem <[email protected]> | 2019-04-20 02:39:31 +0200 |
---|---|---|
committer | Ron Evans <[email protected]> | 2019-04-20 10:18:38 +0200 |
commit | 21a4c14e86e5f30ff3c8ed509f6b2d0f408df08b (patch) | |
tree | c94c5898ee0295c5b9c55776a5c20d4b10df87d5 /testdata/cgo | |
parent | b716cf1afdb6365cbbeb4af974c27c916db36a9a (diff) | |
download | tinygo-21a4c14e86e5f30ff3c8ed509f6b2d0f408df08b.tar.gz tinygo-21a4c14e86e5f30ff3c8ed509f6b2d0f408df08b.zip |
cgo: implement C.struct_ types
These types (called elaborated types in C) are used as part of linked
lists, among others.
This is part an extra feature (to be compatible with CGo C.struct_
types) and part a bugfix: linked lists would result in endless recursion
leading to a stack overflow.
Diffstat (limited to 'testdata/cgo')
-rw-r--r-- | testdata/cgo/main.go | 8 | ||||
-rw-r--r-- | testdata/cgo/main.h | 6 | ||||
-rw-r--r-- | testdata/cgo/out.txt | 3 |
3 files changed, 17 insertions, 0 deletions
diff --git a/testdata/cgo/main.go b/testdata/cgo/main.go index 3f1da8b6d..b722ce107 100644 --- a/testdata/cgo/main.go +++ b/testdata/cgo/main.go @@ -53,6 +53,14 @@ func main() { C.unionSetData(5, 8, 1) println("union global data:", C.globalUnion.data[0], C.globalUnion.data[1], C.globalUnion.data[2]) println("union field:", printUnion(C.globalUnion).f) + + // recursive types, test using a linked list + lastElement := &C.list_t{n: 7, next: nil} + list := &C.list_t{n: 3, next: &C.struct_list_t{n: 6, next: (*C.struct_list_t)(lastElement)}} + for list != nil { + println("n in chain:", list.n) + list = (*C.list_t)(list.next) + } } func printUnion(union C.joined_t) C.joined_t { diff --git a/testdata/cgo/main.h b/testdata/cgo/main.h index 6330b223f..4cdf10ea3 100644 --- a/testdata/cgo/main.h +++ b/testdata/cgo/main.h @@ -12,6 +12,12 @@ typedef struct collection { unsigned char c; } collection_t; +// linked list +typedef struct list_t { + int n; + struct list_t *next; +} list_t; + typedef union joined { myint s; float f; diff --git a/testdata/cgo/out.txt b/testdata/cgo/out.txt index 6fd5ee86e..a5766e6dd 100644 --- a/testdata/cgo/out.txt +++ b/testdata/cgo/out.txt @@ -24,3 +24,6 @@ union local data: 5 8 1 union s method: -33 false union f: +6.280000e+000 union field: +6.280000e+000 +n in chain: 3 +n in chain: 6 +n in chain: 7 |