S = struct
{
    a: u64,
    b: u64,
    c: u64,
    d: u64,
    e: u64
    f: u64,
    g: u64,
    h: u64,
    i: u64,
    j: u64
}

require = fn (ok: u1) void
{
    if (!ok)
    {
        #trap();
    }
}

va_arg_fn = fn [cc(c)] (first_arg: u32, ...) void
{
    if (first_arg != 123456789)
    {
        #trap();
    }

    >va = #va_start();

    >s = #va_arg(&va, S);
    require(s.a == 9);
    require(s.b == 8);
    require(s.c == 7);
    require(s.d == 6);
    require(s.e == 5);
    require(s.f == 4);
    require(s.g == 3);
    require(s.h == 2);
    require(s.i == 1);
    require(s.j == 0);
}

[export] main = fn [cc(c)] () s32
{
    >first_arg: u32 = 123456789;
    >s : S = {
        .a = 9,
        .b = 8,
        .c = 7,
        .d = 6,
        .e = 5,
        .f = 4,
        .g = 3,
        .h = 2,
        .i = 1,
        .j = 0,
    };
    va_arg_fn(first_arg, s);
    return 0;
}