============================================
Struct declarations
============================================

struct s1;

struct s2 {
  int x;
  float y : 5;
};

---

(translation_unit
  (struct_specifier (identifier))
  (struct_specifier (identifier)
    (struct_declaration (identifier) (identifier))
    (struct_declaration (identifier) (identifier) (number_literal))))

============================================
Union declarations
============================================

union u1;

union s2 {
  int x;
  float y;
};

---

(translation_unit
  (union_specifier (identifier))
  (union_specifier (identifier)
    (struct_declaration (identifier) (identifier))
    (struct_declaration (identifier) (identifier))))

============================================
Enum declarations
============================================

enum e1;

enum e2 {
  val1,
  val2 = 5,
  val3
};

enum e3 {
  val1,
};

---

(translation_unit
  (enum_specifier (identifier))
  (enum_specifier (identifier)
    (enumerator (identifier))
    (enumerator (identifier) (number_literal))
    (enumerator (identifier)))
  (enum_specifier (identifier)
    (enumerator (identifier))))

============================================
Primitive-typed variable declarations
============================================

unsigned short int a;
long int b, c = 5, d;
float d, e;

---

(translation_unit
  (declaration (sized_type_specifier (identifier)) (identifier))
  (declaration
    (sized_type_specifier (identifier))
    (identifier)
    (init_declarator (identifier) (number_literal))
    (identifier))
  (declaration (identifier) (identifier) (identifier)))

============================================
Variable storage classes
============================================

int a;
extern int b, c;
auto int d;
register int e;
static int f;

---

(translation_unit
  (declaration (identifier) (identifier))
  (declaration (storage_class_specifier) (identifier) (identifier) (identifier))
  (declaration (storage_class_specifier) (identifier) (identifier))
  (declaration (storage_class_specifier) (identifier) (identifier))
  (declaration (storage_class_specifier) (identifier) (identifier)))

============================================
Composite-typed variable declarations
============================================

struct b c;
union { int e; } f;
enum { g, h } i;

---

(translation_unit
  (declaration
    (struct_specifier (identifier))
    (identifier))
  (declaration
    (union_specifier (struct_declaration (identifier) (identifier)))
    (identifier))
  (declaration
    (enum_specifier (enumerator (identifier)) (enumerator (identifier)))
    (identifier)))

============================================
Pointer variable declarations
============================================

char *the_string;
const char **the_strings;

---

(translation_unit
  (declaration (identifier) (pointer_declarator (identifier)))
  (declaration (type_qualifier) (identifier)
    (pointer_declarator (pointer_declarator (identifier)))))

============================================
Typedefs
============================================

typedef int my_int;

typedef struct {
  int x;
} *a;

---

(translation_unit
  (declaration (storage_class_specifier) (identifier) (identifier))
  (declaration
    (storage_class_specifier)
    (struct_specifier (struct_declaration (identifier) (identifier)))
    (pointer_declarator (identifier))))

============================================
Function declarations
============================================

int main(int argc, const char **argv);
static foo bar();
static baz quux(...);

---

(translation_unit
  (declaration
    (identifier)
    (function_declarator
      (identifier)
      (parameter_type_list
        (parameter_declaration (identifier) (identifier))
        (parameter_declaration (type_qualifier) (identifier) (pointer_declarator (pointer_declarator (identifier)))))))

  (declaration
    (storage_class_specifier)
    (identifier)
    (function_declarator (identifier)))

  (declaration
    (storage_class_specifier)
    (identifier)
    (function_declarator
      (identifier)
      (parameter_type_list))))

============================================
Function definitions
============================================

void * do_stuff(int arg1) {
  return 5;
}

---

(translation_unit
  (function_definition
    (identifier)
    (pointer_declarator
      (function_declarator (identifier)
        (parameter_type_list
          (parameter_declaration (identifier) (identifier)))))
    (compound_statement (return_statement (number_literal)))))
