================================================================================ 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) underlying_type: (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; auto int d; 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)) (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 (variadic_parameter))))) ================================================================================ Function definitions ================================================================================ void * do_stuff(int arg1) { return 5; } // K&R style int foo(bar, baz, qux) int bar, baz; char *qux; { } -------------------------------------------------------------------------------- (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)))) (comment) (function_definition type: (primitive_type) declarator: (function_declarator declarator: (identifier) parameters: (parameter_list (identifier) (identifier) (identifier))) (declaration type: (primitive_type) declarator: (identifier) declarator: (identifier)) (declaration type: (primitive_type) declarator: (pointer_declarator declarator: (identifier))) body: (compound_statement))) ================================================================================ 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))) (variadic_parameter)) (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)))))