#if 0 ''' ' #endif #ifdef __cplusplus template using Box = T*; #endif #if 0 ' ''' #endif #include #include #include #include enum A #ifdef __cplusplus : uint64_t #endif // __cplusplus { a1 = 0, a2 = 2, a3, a4 = 5, }; #ifndef __cplusplus typedef uint64_t A; #endif // __cplusplus enum B #ifdef __cplusplus : uint32_t #endif // __cplusplus { b1 = 0, b2 = 2, b3, b4 = 5, }; #ifndef __cplusplus typedef uint32_t B; #endif // __cplusplus enum C #ifdef __cplusplus : uint16_t #endif // __cplusplus { c1 = 0, c2 = 2, c3, c4 = 5, }; #ifndef __cplusplus typedef uint16_t C; #endif // __cplusplus enum D #ifdef __cplusplus : uint8_t #endif // __cplusplus { d1 = 0, d2 = 2, d3, d4 = 5, }; #ifndef __cplusplus typedef uint8_t D; #endif // __cplusplus enum E #ifdef __cplusplus : uintptr_t #endif // __cplusplus { e1 = 0, e2 = 2, e3, e4 = 5, }; #ifndef __cplusplus typedef uintptr_t E; #endif // __cplusplus enum F #ifdef __cplusplus : intptr_t #endif // __cplusplus { f1 = 0, f2 = 2, f3, f4 = 5, }; #ifndef __cplusplus typedef intptr_t F; #endif // __cplusplus typedef enum L { l1, l2, l3, l4, } L; enum M #ifdef __cplusplus : int8_t #endif // __cplusplus { m1 = -1, m2 = 0, m3 = 1, }; #ifndef __cplusplus typedef int8_t M; #endif // __cplusplus typedef enum N { n1, n2, n3, n4, } N; enum O #ifdef __cplusplus : int8_t #endif // __cplusplus { o1, o2, o3, o4, }; #ifndef __cplusplus typedef int8_t O; #endif // __cplusplus typedef struct J J; typedef struct K K; typedef struct Opaque Opaque; enum G_Tag #ifdef __cplusplus : uint8_t #endif // __cplusplus { Foo, Bar, Baz, }; #ifndef __cplusplus typedef uint8_t G_Tag; #endif // __cplusplus typedef struct Bar_Body { G_Tag tag; uint8_t x; int16_t y; } Bar_Body; typedef union G { G_Tag tag; struct { G_Tag foo_tag; int16_t foo; }; Bar_Body bar; } G; typedef enum H_Tag { H_Foo, H_Bar, H_Baz, } H_Tag; typedef struct H_Bar_Body { uint8_t x; int16_t y; } H_Bar_Body; typedef struct H { H_Tag tag; union { struct { int16_t foo; }; H_Bar_Body bar; }; } H; enum ExI_Tag #ifdef __cplusplus : uint8_t #endif // __cplusplus { ExI_Foo, ExI_Bar, ExI_Baz, }; #ifndef __cplusplus typedef uint8_t ExI_Tag; #endif // __cplusplus typedef struct ExI_Bar_Body { uint8_t x; int16_t y; } ExI_Bar_Body; typedef struct ExI { ExI_Tag tag; union { struct { int16_t foo; }; ExI_Bar_Body bar; }; } ExI; enum P_Tag #ifdef __cplusplus : uint8_t #endif // __cplusplus { P0, P1, }; #ifndef __cplusplus typedef uint8_t P_Tag; #endif // __cplusplus typedef struct P1_Body { uint8_t _0; uint8_t _1; uint8_t _2; } P1_Body; typedef struct P { P_Tag tag; union { struct { uint8_t p0; }; P1_Body p1; }; } P; typedef enum Q_Tag { Ok, Err, } Q_Tag; typedef struct Q { Q_Tag tag; union { struct { uint32_t *ok; }; struct { uint32_t err; }; }; } Q; typedef enum R_Tag { IRFoo, IRBar, IRBaz, } R_Tag; typedef struct IRBar_Body { uint8_t x; int16_t y; } IRBar_Body; typedef struct R { R_Tag tag; union { struct { int16_t IRFoo; }; IRBar_Body IRBar; }; } R; #ifdef __cplusplus extern "C" { #endif // __cplusplus void root(struct Opaque *opaque, A a, B b, C c, D d, E e, F f, union G g, struct H h, struct ExI i, struct J j, struct K k, enum L l, M m, enum N n, O o, struct P p, struct Q q, struct R r); #ifdef __cplusplus } // extern "C" #endif // __cplusplus #if 0 ''' ' #endif #include #include "testing-helpers.h" static_assert(offsetof(CBINDGEN_STRUCT(P), tag) == 0, "unexpected offset for tag"); static_assert(offsetof(CBINDGEN_STRUCT(P), p0) == 1, "unexpected offset for p0"); static_assert(offsetof(CBINDGEN_STRUCT(P), p0) == 1, "unexpected offset for p1"); static_assert(sizeof(CBINDGEN_STRUCT(P)) == 4, "unexpected size for P"); #if 0 ' ''' #endif