master
  1const tests = @import("tests.zig");
  2
  3pub fn addCases(cases: *tests.GenHContext) void {
  4    cases.add("declare enum",
  5        \\const Foo = extern enum { A, B, C };
  6        \\export fn entry(foo: Foo) void { }
  7    , &[_][]const u8{
  8        \\enum Foo {
  9        \\    A = 0,
 10        \\    B = 1,
 11        \\    C = 2
 12        \\};
 13        ,
 14        \\void entry(enum Foo foo);
 15    });
 16
 17    cases.add("declare struct",
 18        \\const Foo = extern struct {
 19        \\    A: i32,
 20        \\    B: f32,
 21        \\    C: bool,
 22        \\    D: u64,
 23        \\    E: u64,
 24        \\    F: u64,
 25        \\};
 26        \\export fn entry(foo: Foo) void { }
 27    , &[_][]const u8{
 28        \\struct Foo {
 29        \\    int32_t A;
 30        \\    float B;
 31        \\    bool C;
 32        \\    uint64_t D;
 33        \\    uint64_t E;
 34        \\    uint64_t F;
 35        \\};
 36        ,
 37        \\void entry(struct Foo foo);
 38        \\
 39    });
 40
 41    cases.add("declare union",
 42        \\const Big = extern struct {
 43        \\    A: u64,
 44        \\    B: u64,
 45        \\    C: u64,
 46        \\    D: u64,
 47        \\    E: u64,
 48        \\};
 49        \\const Foo = extern union {
 50        \\    A: i32,
 51        \\    B: f32,
 52        \\    C: bool,
 53        \\    D: Big,
 54        \\};
 55        \\export fn entry(foo: Foo) void {}
 56    , &[_][]const u8{
 57        \\struct Big {
 58        \\    uint64_t A;
 59        \\    uint64_t B;
 60        \\    uint64_t C;
 61        \\    uint64_t D;
 62        \\    uint64_t E;
 63        \\};
 64        \\
 65        \\union Foo {
 66        \\    int32_t A;
 67        \\    float B;
 68        \\    bool C;
 69        \\    struct Big D;
 70        \\};
 71        ,
 72        \\void entry(union Foo foo);
 73        \\
 74    });
 75
 76    cases.add("declare opaque type",
 77        \\const Foo = opaque {};
 78        \\
 79        \\export fn entry(foo: ?*Foo) void { }
 80    , &[_][]const u8{
 81        \\struct Foo;
 82        ,
 83        \\void entry(struct Foo * foo);
 84    });
 85
 86    cases.add("array field-type",
 87        \\const Foo = extern struct {
 88        \\    A: [2]i32,
 89        \\    B: [4]*u32,
 90        \\};
 91        \\export fn entry(foo: Foo, bar: [3]u8) void { }
 92    , &[_][]const u8{
 93        \\struct Foo {
 94        \\    int32_t A[2];
 95        \\    uint32_t * B[4];
 96        \\};
 97        ,
 98        \\void entry(struct Foo foo, uint8_t bar[]);
 99        \\
100    });
101
102    cases.add("ptr to zig struct",
103        \\const S = struct {
104        \\    a: u8,
105        \\};
106        \\
107        \\export fn a(s: *S) u8 {
108        \\    return s.a;
109        \\}
110    , &[_][]const u8{
111        \\struct S;
112        ,
113        \\uint8_t a(struct S * s);
114        \\
115    });
116
117    cases.add("ptr to zig union",
118        \\const U = union(enum) {
119        \\    A: u8,
120        \\    B: u16,
121        \\};
122        \\
123        \\export fn a(s: *U) u8 {
124        \\    return s.A;
125        \\}
126    , &[_][]const u8{
127        \\union U;
128        ,
129        \\uint8_t a(union U * s);
130        \\
131    });
132
133    cases.add("ptr to zig enum",
134        \\const E = enum(u8) {
135        \\    A,
136        \\    B,
137        \\};
138        \\
139        \\export fn a(s: *E) u8 {
140        \\    return @intFromEnum(s.*);
141        \\}
142    , &[_][]const u8{
143        \\enum E;
144        ,
145        \\uint8_t a(enum E * s);
146        \\
147    });
148}