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

struct s1;

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

struct s3 {
  int x : 1, y : 2;
};

--------------------------------------------------------------------------------

(translation_unit
  (struct_specifier
    name: (type_identifier))
  (struct_specifier
    name: (type_identifier)
    body: (field_declaration_list
      (field_declaration
        type: (primitive_type)
        declarator: (field_identifier))
      (field_declaration
        type: (primitive_type)
        declarator: (field_identifier)
        (bitfield_clause
          (number_literal)))))
  (struct_specifier
    name: (type_identifier)
    body: (field_declaration_list
      (field_declaration
        type: (primitive_type)
        declarator: (field_identifier)
        (bitfield_clause
          (number_literal))
        declarator: (field_identifier)
        (bitfield_clause
          (number_literal))))))

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

union u1;

union s2 {
  int x;
  float y;
};

--------------------------------------------------------------------------------

(translation_unit
  (union_specifier
    name: (type_identifier))
  (union_specifier
    name: (type_identifier)
    body: (field_declaration_list
      (field_declaration
        type: (primitive_type)
        declarator: (field_identifier))
      (field_declaration
        type: (primitive_type)
        declarator: (field_identifier)))))

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

enum e1;

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

enum e3 {
  val1,
};

enum e4: int {
  val1,
};

--------------------------------------------------------------------------------

(translation_unit
  (enum_specifier
    name: (type_identifier))
  (enum_specifier
    name: (type_identifier)
    body: (enumerator_list
      (enumerator
        name: (identifier))
      (enumerator
        name: (identifier)
        value: (number_literal))
      (enumerator
        name: (identifier))))
  (enum_specifier
    name: (type_identifier)
    body: (enumerator_list
      (enumerator
        name: (identifier))))
  (enum_specifier
    name: (type_identifier)
    base: (primitive_type)
    body: (enumerator_list
      (enumerator
        name: (identifier)))))

================================================================================
Struct declarations containing preprocessor directives
================================================================================

struct s {
  #define A 5
  int b[a];
  #undef A
};

--------------------------------------------------------------------------------

(translation_unit
  (struct_specifier
    (type_identifier)
    (field_declaration_list
      (preproc_def
        (identifier)
        (preproc_arg))
      (field_declaration
        (primitive_type)
        (array_declarator
          (field_identifier)
          (identifier)))
      (preproc_call
        (preproc_directive)
        (preproc_arg)))))

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

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

--------------------------------------------------------------------------------

(translation_unit
  (declaration
    type: (sized_type_specifier
      type: (primitive_type))
    declarator: (identifier))
  (declaration
    type: (sized_type_specifier
      type: (primitive_type))
    declarator: (identifier)
    declarator: (init_declarator
      declarator: (identifier)
      value: (number_literal))
    declarator: (identifier))
  (declaration
    type: (primitive_type)
    declarator: (identifier)
    declarator: (identifier))
  (declaration
    type: (sized_type_specifier)
    declarator: (identifier))
  (declaration
    type: (sized_type_specifier)
    declarator: (identifier)
    declarator: (identifier)))

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

int a;
extern int b, c;
register int e;
static int f;
register uint64_t rd_ asm("x" "10");

--------------------------------------------------------------------------------

(translation_unit
  (declaration
    (primitive_type)
    (identifier))
  (declaration
    (storage_class_specifier)
    (primitive_type)
    (identifier)
    (identifier))
  (declaration
    (storage_class_specifier)
    (primitive_type)
    (identifier))
  (declaration
    (storage_class_specifier)
    (primitive_type)
    (identifier))
  (declaration
    (storage_class_specifier)
    (primitive_type)
    (identifier)
    (gnu_asm_expression
      (concatenated_string
        (string_literal
          (string_content))
        (string_literal
          (string_content))))))

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

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

--------------------------------------------------------------------------------

(translation_unit
  (declaration
    type: (struct_specifier
      name: (type_identifier))
    declarator: (identifier))
  (declaration
    type: (union_specifier
      body: (field_declaration_list
        (field_declaration
          type: (primitive_type)
          declarator: (field_identifier))))
    declarator: (identifier))
  (declaration
    type: (enum_specifier
      body: (enumerator_list
        (enumerator
          name: (identifier))
        (enumerator
          name: (identifier))))
    declarator: (identifier)))

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

char *the_string;
const char **the_strings;
int const * const restrict x;

--------------------------------------------------------------------------------

(translation_unit
  (declaration
    type: (primitive_type)
    declarator: (pointer_declarator
      declarator: (identifier)))
  (declaration
    (type_qualifier)
    type: (primitive_type)
    declarator: (pointer_declarator
      declarator: (pointer_declarator
        declarator: (identifier))))
  (declaration
    type: (primitive_type)
    (type_qualifier)
    declarator: (pointer_declarator
      (type_qualifier)
      (type_qualifier)
      declarator: (identifier))))

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

typedef int my_int;

typedef struct {
  int x;
} *a;

typedef void my_callback(void *, size_t);

typedef struct A {
  int i;
} a, b;

typedef void const *voidpc;
typedef void volatile *voidpv;
typedef void const volatile *const voidpcv;

typedef unsigned long int;
typedef unsigned short ptrdiff_t;
typedef short charptr_t;
typedef unsigned nullptr_t;
typedef signed max_align_t;

typedef unsigned long ulong_t;
typedef long long_t;
typedef unsigned short ushort_t;
typedef short short_t;
typedef unsigned unsigned_t;
typedef signed signed_t;

typedef long long;
typedef short short;
typedef unsigned int uint;
typedef unsigned short ushort;
typedef unsigned unsigned short;
typedef signed signed short;
typedef signed signed unsigned;

typedef int register_t __attribute__((__mode__(__word__)));

__extension__ typedef long int greg_t;

__extension__ typedef struct {
    long long int quot;
    long long int rem;
} lldiv_t;

--------------------------------------------------------------------------------

(translation_unit
  (type_definition
    type: (primitive_type)
    declarator: (type_identifier))
  (type_definition
    type: (struct_specifier
      body: (field_declaration_list
        (field_declaration
          type: (primitive_type)
          declarator: (field_identifier))))
    declarator: (pointer_declarator
      declarator: (type_identifier)))
  (type_definition
    type: (primitive_type)
    declarator: (function_declarator
      declarator: (type_identifier)
      parameters: (parameter_list
        (parameter_declaration
          type: (primitive_type)
          declarator: (abstract_pointer_declarator))
        (parameter_declaration
          type: (primitive_type)))))
  (type_definition
    type: (struct_specifier
      name: (type_identifier)
      body: (field_declaration_list
        (field_declaration
          type: (primitive_type)
          declarator: (field_identifier))))
    declarator: (type_identifier)
    declarator: (type_identifier))
  (type_definition
    type: (primitive_type)
    (type_qualifier)
    declarator: (pointer_declarator
      declarator: (type_identifier)))
  (type_definition
    type: (primitive_type)
    (type_qualifier)
    declarator: (pointer_declarator
      declarator: (type_identifier)))
  (type_definition
    type: (primitive_type)
    (type_qualifier)
    (type_qualifier)
    declarator: (pointer_declarator
      (type_qualifier)
      declarator: (type_identifier)))
  (type_definition
    type: (sized_type_specifier)
    declarator: (primitive_type))
  (type_definition
    type: (sized_type_specifier)
    declarator: (primitive_type))
  (type_definition
    type: (sized_type_specifier)
    declarator: (primitive_type))
  (type_definition
    type: (sized_type_specifier)
    declarator: (primitive_type))
  (type_definition
    type: (sized_type_specifier)
    declarator: (primitive_type))
  (type_definition
    type: (sized_type_specifier)
    declarator: (type_identifier))
  (type_definition
    type: (sized_type_specifier)
    declarator: (type_identifier))
  (type_definition
    type: (sized_type_specifier)
    declarator: (type_identifier))
  (type_definition
    type: (sized_type_specifier)
    declarator: (type_identifier))
  (type_definition
    type: (sized_type_specifier)
    declarator: (type_identifier))
  (type_definition
    type: (sized_type_specifier)
    declarator: (type_identifier))
  (type_definition
    type: (sized_type_specifier)
    declarator: (primitive_type))
  (type_definition
    type: (sized_type_specifier)
    declarator: (primitive_type))
  (type_definition
    type: (sized_type_specifier
      type: (primitive_type))
    declarator: (type_identifier))
  (type_definition
    type: (sized_type_specifier)
    declarator: (type_identifier))
  (type_definition
    type: (sized_type_specifier)
    declarator: (primitive_type))
  (type_definition
    type: (sized_type_specifier)
    declarator: (primitive_type))
  (type_definition
    type: (sized_type_specifier)
    declarator: (primitive_type))
  (type_definition
    type: (primitive_type)
    declarator: (type_identifier)
    (attribute_specifier
      (argument_list
        (call_expression
          function: (identifier)
          arguments: (argument_list
            (identifier))))))
  (type_definition
    type: (sized_type_specifier
      type: (primitive_type))
    declarator: (type_identifier))
  (type_definition
    type: (struct_specifier
      body: (field_declaration_list
        (field_declaration
          type: (sized_type_specifier
            type: (primitive_type))
          declarator: (field_identifier))
        (field_declaration
          type: (sized_type_specifier
            type: (primitive_type))
          declarator: (field_identifier))))
    declarator: (type_identifier)))

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

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

--------------------------------------------------------------------------------

(translation_unit
  (declaration
    (primitive_type)
    (function_declarator
      (identifier)
      (parameter_list
        (parameter_declaration
          (primitive_type)
          (identifier))
        (parameter_declaration
          (type_qualifier)
          (primitive_type)
          (pointer_declarator
            (pointer_declarator
              (identifier)))))))
  (declaration
    (storage_class_specifier)
    (type_identifier)
    (function_declarator
      (identifier)
      (parameter_list)))
  (declaration
    (storage_class_specifier)
    (type_identifier)
    (function_declarator
      (identifier)
      (parameter_list))))

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

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

--------------------------------------------------------------------------------

(translation_unit
  (function_definition
    type: (primitive_type)
    declarator: (pointer_declarator
      declarator: (function_declarator
        declarator: (identifier)
        parameters: (parameter_list
          (parameter_declaration
            type: (primitive_type)
            declarator: (identifier)))))
    body: (compound_statement
      (return_statement
        (number_literal)))))

================================================================================
Function specifiers after types
================================================================================

int static inline do_stuff(int arg1) {
  return 5;
}

--------------------------------------------------------------------------------

(translation_unit
  (function_definition
    (primitive_type)
    (storage_class_specifier)
    (storage_class_specifier)
    (function_declarator
      (identifier)
      (parameter_list
        (parameter_declaration
          (primitive_type)
          (identifier))))
    (compound_statement
      (return_statement
        (number_literal)))))

================================================================================
Linkage specifications
================================================================================

extern "C" int foo();

extern "C" int foo() { return 0; }

extern "C" {
  int bar();
  int baz();
}

--------------------------------------------------------------------------------

(translation_unit
  (linkage_specification
    (string_literal
      (string_content))
    (declaration
      (primitive_type)
      (function_declarator
        (identifier)
        (parameter_list))))
  (linkage_specification
    (string_literal
      (string_content))
    (function_definition
      (primitive_type)
      (function_declarator
        (identifier)
        (parameter_list))
      (compound_statement
        (return_statement
          (number_literal)))))
  (linkage_specification
    (string_literal
      (string_content))
    (declaration_list
      (declaration
        (primitive_type)
        (function_declarator
          (identifier)
          (parameter_list)))
      (declaration
        (primitive_type)
        (function_declarator
          (identifier)
          (parameter_list))))))

================================================================================
Type qualifiers
================================================================================

const _Atomic unsigned long int x = 5;
restrict int y = 6;
volatile int z = 7;
constexpr int a = 8;
__thread int c = 9;
noreturn void b() {}
 __extension__ extern int ffsll (long long int __ll)
     __attribute__ ((__nothrow__ )) __attribute__ ((__const__));

--------------------------------------------------------------------------------

(translation_unit
  (declaration
    (type_qualifier)
    (type_qualifier)
    (sized_type_specifier
      (primitive_type))
    (init_declarator
      (identifier)
      (number_literal)))
  (declaration
    (type_qualifier)
    (primitive_type)
    (init_declarator
      (identifier)
      (number_literal)))
  (declaration
    (type_qualifier)
    (primitive_type)
    (init_declarator
      (identifier)
      (number_literal)))
  (declaration
    (type_qualifier)
    (primitive_type)
    (init_declarator
      (identifier)
      (number_literal)))
  (declaration
    (storage_class_specifier)
    (primitive_type)
    (init_declarator
      (identifier)
      (number_literal)))
  (function_definition
    (type_qualifier)
    (primitive_type)
    (function_declarator
      (identifier)
      (parameter_list))
    (compound_statement))
  (declaration
    (type_qualifier)
    (storage_class_specifier)
    (primitive_type)
    (function_declarator
      (identifier)
      (parameter_list
        (parameter_declaration
          (sized_type_specifier
            (primitive_type))
          (identifier)))
      (attribute_specifier
        (argument_list
          (identifier)))
      (attribute_specifier
        (argument_list
          (identifier))))))

================================================================================
Local array declarations
================================================================================

int main() {
  char the_buffer[the_size];
  char the_other_buffer[*];
}

--------------------------------------------------------------------------------

(translation_unit
  (function_definition
    (primitive_type)
    (function_declarator
      (identifier)
      (parameter_list))
    (compound_statement
      (declaration
        (primitive_type)
        (array_declarator
          (identifier)
          (identifier)))
      (declaration
        (primitive_type)
        (array_declarator
          (identifier))))))

================================================================================
Attributes
================================================================================

extern __attribute__((visibility("hidden"))) int foo();
extern int bar() __attribute__((const));
void die(const char *format, ...) __attribute__((noreturn))
                                  __attribute__((format(printf,1,2)));
extern __attribute__((visibility("default"), weak)) int print_status();

extern int strerror_r(int __errnum, char *__buf,
                      int __buflen) __asm__(""
                                            "__xpg_strerror_r")
    __attribute__((__nothrow__)) __attribute__((__nonnull__(2)));

int f([[a::b(c), d]] int x) {}

[[gnu::always_inline]] [[gnu::hot]] [[gnu::const]] [[nodiscard]]
int g(void);

[[gnu::always_inline, gnu::hot, gnu::const, nodiscard]]
int g(void);

int i [[maybe_unused]];
void f[[gnu::always_inline]]();

[[nodiscard("reason")]] int foo;

[[fallthrough]];

struct S {
  int a [[deprecated]];
};

typedef int MyInt [[deprecated]];

struct X {
    int a __attribute__((aligned(4)));
} __attribute__((aligned(16)));

union Y {
    int a __attribute__((aligned(4)));
} __attribute__((aligned(16)));

enum Z {
    A
} __attribute__((aligned(16)));

struct __attribute__((__packed__)) foo_t {
  int x;
};

--------------------------------------------------------------------------------

(translation_unit
  (declaration
    (storage_class_specifier)
    (attribute_specifier
      (argument_list
        (call_expression
          (identifier)
          (argument_list
            (string_literal
              (string_content))))))
    (primitive_type)
    (function_declarator
      (identifier)
      (parameter_list)))
  (declaration
    (storage_class_specifier)
    (primitive_type)
    (function_declarator
      (identifier)
      (parameter_list)
      (attribute_specifier
        (argument_list
          (identifier)))))
  (declaration
    (primitive_type)
    (function_declarator
      (identifier)
      (parameter_list
        (parameter_declaration
          (type_qualifier)
          (primitive_type)
          (pointer_declarator
            (identifier))))
      (attribute_specifier
        (argument_list
          (identifier)))
      (attribute_specifier
        (argument_list
          (call_expression
            (identifier)
            (argument_list
              (identifier)
              (number_literal)
              (number_literal)))))))
  (declaration
    (storage_class_specifier)
    (attribute_specifier
      (argument_list
        (call_expression
          (identifier)
          (argument_list
            (string_literal
              (string_content))))
        (identifier)))
    (primitive_type)
    (function_declarator
      (identifier)
      (parameter_list)))
  (declaration
    (storage_class_specifier)
    (primitive_type)
    (function_declarator
      (identifier)
      (parameter_list
        (parameter_declaration
          (primitive_type)
          (identifier))
        (parameter_declaration
          (primitive_type)
          (pointer_declarator
            (identifier)))
        (parameter_declaration
          (primitive_type)
          (identifier)))
      (gnu_asm_expression
        (concatenated_string
          (string_literal)
          (string_literal
            (string_content))))
      (attribute_specifier
        (argument_list
          (identifier)))
      (attribute_specifier
        (argument_list
          (call_expression
            (identifier)
            (argument_list
              (number_literal)))))))
  (function_definition
    (primitive_type)
    (function_declarator
      (identifier)
      (parameter_list
        (parameter_declaration
          (attribute_declaration
            (attribute
              (identifier)
              (identifier)
              (argument_list
                (identifier)))
            (attribute
              (identifier)))
          (primitive_type)
          (identifier))))
    (compound_statement))
  (declaration
    (attribute_declaration
      (attribute
        (identifier)
        (identifier)))
    (attribute_declaration
      (attribute
        (identifier)
        (identifier)))
    (attribute_declaration
      (attribute
        (identifier)
        (identifier)))
    (attribute_declaration
      (attribute
        (identifier)))
    (primitive_type)
    (function_declarator
      (identifier)
      (parameter_list
        (parameter_declaration
          (primitive_type)))))
  (declaration
    (attribute_declaration
      (attribute
        (identifier)
        (identifier))
      (attribute
        (identifier)
        (identifier))
      (attribute
        (identifier)
        (identifier))
      (attribute
        (identifier)))
    (primitive_type)
    (function_declarator
      (identifier)
      (parameter_list
        (parameter_declaration
          (primitive_type)))))
  (declaration
    (primitive_type)
    (attributed_declarator
      (identifier)
      (attribute_declaration
        (attribute
          (identifier)))))
  (declaration
    (primitive_type)
    (function_declarator
      (attributed_declarator
        (identifier)
        (attribute_declaration
          (attribute
            (identifier)
            (identifier))))
      (parameter_list)))
  (declaration
    (attribute_declaration
      (attribute
        (identifier)
        (argument_list
          (string_literal
            (string_content)))))
    (primitive_type)
    (identifier))
  (attributed_statement
    (attribute_declaration
      (attribute
        (identifier)))
    (expression_statement))
  (struct_specifier
    (type_identifier)
    (field_declaration_list
      (field_declaration
        (primitive_type)
        (attributed_declarator
          (field_identifier)
          (attribute_declaration
            (attribute
              (identifier)))))))
  (type_definition
    (primitive_type)
    (attributed_declarator
      (type_identifier)
      (attribute_declaration
        (attribute
          (identifier)))))
  (struct_specifier
    (type_identifier)
    (field_declaration_list
      (field_declaration
        (primitive_type)
        (field_identifier)
        (attribute_specifier
          (argument_list
            (call_expression
              (identifier)
              (argument_list
                (number_literal)))))))
    (attribute_specifier
      (argument_list
        (call_expression
          (identifier)
          (argument_list
            (number_literal))))))
  (union_specifier
    (type_identifier)
    (field_declaration_list
      (field_declaration
        (primitive_type)
        (field_identifier)
        (attribute_specifier
          (argument_list
            (call_expression
              (identifier)
              (argument_list
                (number_literal)))))))
    (attribute_specifier
      (argument_list
        (call_expression
          (identifier)
          (argument_list
            (number_literal))))))
  (enum_specifier
    (type_identifier)
    (enumerator_list
      (enumerator
        (identifier)))
    (attribute_specifier
      (argument_list
        (call_expression
          (identifier)
          (argument_list
            (number_literal))))))
  (struct_specifier
    (attribute_specifier
      (argument_list
        (identifier)))
    (type_identifier)
    (field_declaration_list
      (field_declaration
        (primitive_type)
        (field_identifier)))))
