aboutsummaryrefslogtreecommitdiffhomepage
path: root/testdata/cgo
diff options
context:
space:
mode:
authorAyke van Laethem <[email protected]>2019-04-20 02:39:31 +0200
committerRon Evans <[email protected]>2019-04-20 10:18:38 +0200
commit21a4c14e86e5f30ff3c8ed509f6b2d0f408df08b (patch)
treec94c5898ee0295c5b9c55776a5c20d4b10df87d5 /testdata/cgo
parentb716cf1afdb6365cbbeb4af974c27c916db36a9a (diff)
downloadtinygo-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.go8
-rw-r--r--testdata/cgo/main.h6
-rw-r--r--testdata/cgo/out.txt3
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