#define MY_ASSERT(...) do { } while (0)
#define MY_ATTRS __attribute((noinline))


from libc.stdint cimport int8_t, int16_t, int32_t, int64_t, intptr_t
from libc.stdint cimport uint8_t, uint16_t, uint32_t, uint64_t, uintptr_t
cdef extern from *:
  ctypedef bint bool
  ctypedef struct va_list

cdef extern from *:

  ctypedef struct I:
    pass

  cdef enum:
    H_Foo,
    H_Bar,
    H_Baz,
  ctypedef uint8_t H_Tag;

  ctypedef struct H_Bar_Body:
    uint8_t x;
    int16_t y;

  ctypedef struct H:
    H_Tag tag;
    int16_t foo;
    H_Bar_Body bar;

  cdef enum:
    J_Foo,
    J_Bar,
    J_Baz,
  ctypedef uint8_t J_Tag;

  ctypedef struct J_Bar_Body:
    uint8_t x;
    int16_t y;

  ctypedef struct J:
    J_Tag tag;
    int16_t foo;
    J_Bar_Body bar;

  cdef enum:
    K_Foo,
    K_Bar,
    K_Baz,
  ctypedef uint8_t K_Tag;

  ctypedef struct K_Bar_Body:
    K_Tag tag;
    uint8_t x;
    int16_t y;

  ctypedef union K:
    K_Tag tag;
    K_Tag foo_tag;
    int16_t foo;
    K_Bar_Body bar;

  void foo(H h, I i, J j, K k);
