================================================================================ Number literals ================================================================================ double a = { 0xAC00, 0.123, 0b1010001, 0xabc00ull, -0.1f, 1'000'000.000'001, 24e-5, 0.1E, 58., 4e2, 123.456e-67, .1E4f, 0x10.1p0, 0X1, 0B1, 2.0dd, 5wb, }; -------------------------------------------------------------------------------- (translation_unit (declaration (primitive_type) (init_declarator (identifier) (initializer_list (number_literal) (number_literal) (number_literal) (number_literal) (number_literal) (number_literal) (number_literal) (number_literal) (number_literal) (number_literal) (number_literal) (number_literal) (number_literal) (number_literal) (number_literal) (number_literal) (number_literal))))) ================================================================================ Identifiers ================================================================================ int main() { _abc; d_EG123; $f; } -------------------------------------------------------------------------------- (translation_unit (function_definition (primitive_type) (function_declarator (identifier) (parameter_list)) (compound_statement (expression_statement (identifier)) (expression_statement (identifier)) (expression_statement (identifier))))) ================================================================================ Unicode Identifiers ================================================================================ int main() { µs; blah_accenté; } -------------------------------------------------------------------------------- (translation_unit (function_definition (primitive_type) (function_declarator (identifier) (parameter_list)) (compound_statement (expression_statement (identifier)) (expression_statement (identifier))))) ================================================================================ Common constants ================================================================================ int main() { true; false; NULL; // regression test - identifiers starting w/ these strings should tokenize correctly. true_value; false_value; NULL_value; } -------------------------------------------------------------------------------- (translation_unit (function_definition (primitive_type) (function_declarator (identifier) (parameter_list)) (compound_statement (expression_statement (true)) (expression_statement (false)) (expression_statement (null)) (comment) (expression_statement (identifier)) (expression_statement (identifier)) (expression_statement (identifier))))) ================================================================================ Function calls ================================================================================ int main() { printf("hi! %d\n", x); __assert_fail("some_error_message", 115, __extension__ __func__); } -------------------------------------------------------------------------------- (translation_unit (function_definition (primitive_type) (function_declarator (identifier) (parameter_list)) (compound_statement (expression_statement (call_expression (identifier) (argument_list (string_literal (string_content) (escape_sequence)) (identifier)))) (expression_statement (call_expression (identifier) (argument_list (string_literal (string_content)) (number_literal) (identifier))))))) ================================================================================ GNU inline assembly ================================================================================ asm volatile ( "mov r0, %0\n" "mov r1, %[y]\n" "add r2, r0, r1\n" "mov %1, r2\n" : "r" (z) : "=r" (x), [y] "=r" ((uintptr_t) y) : "r2"); -------------------------------------------------------------------------------- (translation_unit (expression_statement (gnu_asm_expression (gnu_asm_qualifier) (concatenated_string (string_literal (string_content) (escape_sequence)) (string_literal (string_content) (escape_sequence)) (string_literal (string_content) (escape_sequence)) (string_literal (string_content) (escape_sequence))) (gnu_asm_output_operand_list (gnu_asm_output_operand (string_literal (string_content)) (identifier))) (gnu_asm_input_operand_list (gnu_asm_input_operand (string_literal (string_content)) (identifier)) (gnu_asm_input_operand (identifier) (string_literal (string_content)) (cast_expression (type_descriptor (primitive_type)) (identifier)))) (gnu_asm_clobber_list (string_literal (string_content)))))) ================================================================================ Function call with compound statement ================================================================================ #define TAKES_BLOCK(x, block) for (i = 0; i < x; i++) block int main(void) { { int x = 0; } TAKES_BLOCK(10, { // Doesn't matter what I put in here }); } -------------------------------------------------------------------------------- (translation_unit (preproc_function_def (identifier) (preproc_params (identifier) (identifier)) (preproc_arg)) (function_definition (primitive_type) (function_declarator (identifier) (parameter_list (parameter_declaration (primitive_type)))) (compound_statement (compound_statement (declaration (primitive_type) (init_declarator (identifier) (number_literal)))) (expression_statement (call_expression (identifier) (argument_list (number_literal) (compound_statement (comment)))))))) ================================================================================ String literals ================================================================================ int main() { "a"; "b" "c" "d"; e "f" g; "\"hi\""; L"bonjour"; u"guten morgen"; U"buenos dias"; u8"buongiorno"; } -------------------------------------------------------------------------------- (translation_unit (function_definition (primitive_type) (function_declarator (identifier) (parameter_list)) (compound_statement (expression_statement (string_literal (string_content))) (expression_statement (concatenated_string (string_literal (string_content)) (string_literal (string_content)) (string_literal (string_content)))) (expression_statement (concatenated_string (identifier) (string_literal (string_content)) (identifier))) (expression_statement (string_literal (escape_sequence) (string_content) (escape_sequence))) (expression_statement (string_literal (string_content))) (expression_statement (string_literal (string_content))) (expression_statement (string_literal (string_content))) (expression_statement (string_literal (string_content)))))) ================================================================================ Character literals ================================================================================ int main() { 'a'; '\0'; '\t'; '\''; L'b'; u'c'; U'\xa1'; u8'\x1A'; } -------------------------------------------------------------------------------- (translation_unit (function_definition (primitive_type) (function_declarator (identifier) (parameter_list)) (compound_statement (expression_statement (char_literal (character))) (expression_statement (char_literal (escape_sequence))) (expression_statement (char_literal (escape_sequence))) (expression_statement (char_literal (escape_sequence))) (expression_statement (char_literal (character))) (expression_statement (char_literal (character))) (expression_statement (char_literal (escape_sequence))) (expression_statement (char_literal (escape_sequence)))))) ================================================================================ Field access ================================================================================ int main() { s.data1; p->data2; q[data3]; } -------------------------------------------------------------------------------- (translation_unit (function_definition (primitive_type) (function_declarator (identifier) (parameter_list)) (compound_statement (expression_statement (field_expression (identifier) (field_identifier))) (expression_statement (field_expression (identifier) (field_identifier))) (expression_statement (subscript_expression (identifier) (identifier)))))) ================================================================================ Boolean operators ================================================================================ int main() { !x || !y && !z; } -------------------------------------------------------------------------------- (translation_unit (function_definition (primitive_type) (function_declarator (identifier) (parameter_list)) (compound_statement (expression_statement (binary_expression (unary_expression (identifier)) (binary_expression (unary_expression (identifier)) (unary_expression (identifier)))))))) ================================================================================ Math operators ================================================================================ int main() { -a / b + c * -d; a++ - ++b + c-- + --d; ++L; } -------------------------------------------------------------------------------- (translation_unit (function_definition (primitive_type) (function_declarator (identifier) (parameter_list)) (compound_statement (expression_statement (binary_expression (binary_expression (unary_expression (identifier)) (identifier)) (binary_expression (identifier) (unary_expression (identifier))))) (expression_statement (binary_expression (binary_expression (binary_expression (update_expression (identifier)) (update_expression (identifier))) (update_expression (identifier))) (update_expression (identifier)))) (expression_statement (update_expression (identifier)))))) ================================================================================ The comma operator ================================================================================ int main() { i--, j--; (i--, j--); } -------------------------------------------------------------------------------- (translation_unit (function_definition (primitive_type) (function_declarator (identifier) (parameter_list)) (compound_statement (expression_statement (comma_expression (update_expression (identifier)) (update_expression (identifier)))) (expression_statement (parenthesized_expression (comma_expression (update_expression (identifier)) (update_expression (identifier)))))))) ================================================================================ Assignments ================================================================================ int main() { static int a = 1; b = *c = 2; d.e = 3; f->g = 4; h[i] = j; k += l; m -= o; n *= p; q /= r; *s++ = 1; (*t) = 1; a *= ((b!=c) ? d : e); } -------------------------------------------------------------------------------- (translation_unit (function_definition type: (primitive_type) declarator: (function_declarator declarator: (identifier) parameters: (parameter_list)) body: (compound_statement (declaration (storage_class_specifier) type: (primitive_type) declarator: (init_declarator declarator: (identifier) value: (number_literal))) (expression_statement (assignment_expression left: (identifier) right: (assignment_expression left: (pointer_expression argument: (identifier)) right: (number_literal)))) (expression_statement (assignment_expression left: (field_expression argument: (identifier) field: (field_identifier)) right: (number_literal))) (expression_statement (assignment_expression left: (field_expression argument: (identifier) field: (field_identifier)) right: (number_literal))) (expression_statement (assignment_expression left: (subscript_expression argument: (identifier) index: (identifier)) right: (identifier))) (expression_statement (assignment_expression left: (identifier) right: (identifier))) (expression_statement (assignment_expression left: (identifier) right: (identifier))) (expression_statement (assignment_expression left: (identifier) right: (identifier))) (expression_statement (assignment_expression left: (identifier) right: (identifier))) (expression_statement (assignment_expression left: (pointer_expression argument: (update_expression argument: (identifier))) right: (number_literal))) (expression_statement (assignment_expression left: (parenthesized_expression (pointer_expression argument: (identifier))) right: (number_literal))) (expression_statement (assignment_expression left: (identifier) right: (parenthesized_expression (conditional_expression condition: (parenthesized_expression (binary_expression left: (identifier) right: (identifier))) consequence: (identifier) alternative: (identifier)))))))) ================================================================================ Pointer operations ================================================================================ int main() { doSomething(&x, *x); } -------------------------------------------------------------------------------- (translation_unit (function_definition (primitive_type) (function_declarator (identifier) (parameter_list)) (compound_statement (expression_statement (call_expression (identifier) (argument_list (pointer_expression (identifier)) (pointer_expression (identifier)))))))) ================================================================================ Type-casts ================================================================================ int main() { x = (const SomeType *)thing; } -------------------------------------------------------------------------------- (translation_unit (function_definition type: (primitive_type) declarator: (function_declarator declarator: (identifier) parameters: (parameter_list)) body: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor (type_qualifier) type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (identifier))))))) ================================================================================ Sizeof expressions ================================================================================ int main() { sizeof x.a; sizeof(x.a); sizeof(const char **); sizeof(char * ()); sizeof(1) + 1; sizeof((1) + 1); sizeof(int) + 1; sizeof(struct foo) + sizeof(struct bar) + 1; } -------------------------------------------------------------------------------- (translation_unit (function_definition (primitive_type) (function_declarator (identifier) (parameter_list)) (compound_statement (expression_statement (sizeof_expression (field_expression (identifier) (field_identifier)))) (expression_statement (sizeof_expression (parenthesized_expression (field_expression (identifier) (field_identifier))))) (expression_statement (sizeof_expression (type_descriptor (type_qualifier) (primitive_type) (abstract_pointer_declarator (abstract_pointer_declarator))))) (expression_statement (sizeof_expression (type_descriptor (primitive_type) (abstract_pointer_declarator (abstract_function_declarator (parameter_list)))))) (expression_statement (binary_expression (sizeof_expression (parenthesized_expression (number_literal))) (number_literal))) (expression_statement (sizeof_expression (parenthesized_expression (binary_expression (parenthesized_expression (number_literal)) (number_literal))))) (expression_statement (binary_expression (sizeof_expression (type_descriptor (primitive_type))) (number_literal))) (expression_statement (binary_expression (binary_expression (sizeof_expression (type_descriptor (struct_specifier (type_identifier)))) (sizeof_expression (type_descriptor (struct_specifier (type_identifier))))) (number_literal)))))) ================================================================================ Alignof expressions ================================================================================ typedef struct { long long __clang_max_align_nonce1 __attribute__((__aligned__(__alignof__(long long)))); long double __clang_max_align_nonce2 __attribute__((__aligned__(__alignof__(long double)))); } max_align_t; -------------------------------------------------------------------------------- (translation_unit (type_definition (struct_specifier (field_declaration_list (field_declaration (sized_type_specifier) (field_identifier) (attribute_specifier (argument_list (call_expression (identifier) (argument_list (alignof_expression (type_descriptor (sized_type_specifier)))))))) (field_declaration (sized_type_specifier (primitive_type)) (field_identifier) (attribute_specifier (argument_list (call_expression (identifier) (argument_list (alignof_expression (type_descriptor (sized_type_specifier (primitive_type))))))))))) (primitive_type))) ================================================================================ Offsetof expressions ================================================================================ int main() { offsetof( struct x, a ); offsetof( x, a ); offsetof( x, a ) + 1; } -------------------------------------------------------------------------------- (translation_unit (function_definition (primitive_type) (function_declarator (identifier) (parameter_list)) (compound_statement (expression_statement (offsetof_expression (type_descriptor (struct_specifier (type_identifier))) (field_identifier))) (expression_statement (offsetof_expression (type_descriptor (type_identifier)) (field_identifier))) (expression_statement (binary_expression (offsetof_expression (type_descriptor (type_identifier)) (field_identifier)) (number_literal)))))) ================================================================================ Compound literals ================================================================================ int main() { x = (SomeType) { .f1.f2[f3] = 5, .f4 = {} }; y = (struct SomeStruct) { 7, 8 }; z = (char const []) {'a', 'b'}; } -------------------------------------------------------------------------------- (translation_unit (function_definition (primitive_type) (function_declarator (identifier) (parameter_list)) (compound_statement (expression_statement (assignment_expression (identifier) (compound_literal_expression (type_descriptor (type_identifier)) (initializer_list (initializer_pair (field_designator (field_identifier)) (field_designator (field_identifier)) (subscript_designator (identifier)) (number_literal)) (initializer_pair (field_designator (field_identifier)) (initializer_list)))))) (expression_statement (assignment_expression (identifier) (compound_literal_expression (type_descriptor (struct_specifier (type_identifier))) (initializer_list (number_literal) (number_literal))))) (expression_statement (assignment_expression (identifier) (compound_literal_expression (type_descriptor (primitive_type) (type_qualifier) (abstract_array_declarator)) (initializer_list (char_literal (character)) (char_literal (character))))))))) ================================================================================ Compound literals with trailing commas ================================================================================ int main() { y = (struct SomeStruct) { 7, 8, }; } -------------------------------------------------------------------------------- (translation_unit (function_definition (primitive_type) (function_declarator (identifier) (parameter_list)) (compound_statement (expression_statement (assignment_expression (identifier) (compound_literal_expression (type_descriptor (struct_specifier (type_identifier))) (initializer_list (number_literal) (number_literal)))))))) ================================================================================ Comments with escaped newlines ================================================================================ // one \ two -------------------------------------------------------------------------------- (translation_unit (comment)) ================================================================================ Comments with escaped chars and newlines ================================================================================ // one \a \b \ two // one \c \d -------------------------------------------------------------------------------- (translation_unit (comment) (comment)) ================================================================================ Generic Expressions ================================================================================ int main(int argc, char **argv) { int a = 10; float b = 3.14; double c = 2.71828; char d = 'A'; a = _Generic(d, int: 5, float: 0, char: 100); b = _Generic(a, void *: 0, int: 4.0, float: 3.14, double: 2.71828, char: 1.0); c = _Generic(b, void *: 0, int: 4.0, float: 3.14, double: 2.71828, char: 1.0); d = _Generic(c, void *: '\0', int: '0', float: '3', double: '2', char: '1'); _Generic(a, int: printf("a is an int\n"), float: printf("a is a float\n"), double: printf("a is a double\n"), char: printf("a is a char\n")); _Generic(b, int: printf("b is an int\n"), float: printf("b is a float\n"), double: printf("b is a double\n"), char: printf("b is a char\n")); _Generic(c, int: printf("c is an int\n"), float: printf("c is a float\n"), double: printf("c is a double\n"), char: printf("c is a char\n")); _Generic(d, int: printf("d is an int\n"), float: printf("d is a float\n"), double: printf("d is a double\n"), char: printf("d is a char\n")); return 0; } -------------------------------------------------------------------------------- (translation_unit (function_definition (primitive_type) (function_declarator (identifier) (parameter_list (parameter_declaration (primitive_type) (identifier)) (parameter_declaration (primitive_type) (pointer_declarator (pointer_declarator (identifier)))))) (compound_statement (declaration (primitive_type) (init_declarator (identifier) (number_literal))) (declaration (primitive_type) (init_declarator (identifier) (number_literal))) (declaration (primitive_type) (init_declarator (identifier) (number_literal))) (declaration (primitive_type) (init_declarator (identifier) (char_literal (character)))) (expression_statement (assignment_expression (identifier) (generic_expression (identifier) (type_descriptor (primitive_type)) (number_literal) (type_descriptor (primitive_type)) (number_literal) (type_descriptor (primitive_type)) (number_literal)))) (expression_statement (assignment_expression (identifier) (generic_expression (identifier) (type_descriptor (primitive_type) (abstract_pointer_declarator)) (number_literal) (type_descriptor (primitive_type)) (number_literal) (type_descriptor (primitive_type)) (number_literal) (type_descriptor (primitive_type)) (number_literal) (type_descriptor (primitive_type)) (number_literal)))) (expression_statement (assignment_expression (identifier) (generic_expression (identifier) (type_descriptor (primitive_type) (abstract_pointer_declarator)) (number_literal) (type_descriptor (primitive_type)) (number_literal) (type_descriptor (primitive_type)) (number_literal) (type_descriptor (primitive_type)) (number_literal) (type_descriptor (primitive_type)) (number_literal)))) (expression_statement (assignment_expression (identifier) (generic_expression (identifier) (type_descriptor (primitive_type) (abstract_pointer_declarator)) (char_literal (escape_sequence)) (type_descriptor (primitive_type)) (char_literal (character)) (type_descriptor (primitive_type)) (char_literal (character)) (type_descriptor (primitive_type)) (char_literal (character)) (type_descriptor (primitive_type)) (char_literal (character))))) (expression_statement (generic_expression (identifier) (type_descriptor (primitive_type)) (call_expression (identifier) (argument_list (string_literal (string_content) (escape_sequence)))) (type_descriptor (primitive_type)) (call_expression (identifier) (argument_list (string_literal (string_content) (escape_sequence)))) (type_descriptor (primitive_type)) (call_expression (identifier) (argument_list (string_literal (string_content) (escape_sequence)))) (type_descriptor (primitive_type)) (call_expression (identifier) (argument_list (string_literal (string_content) (escape_sequence)))))) (expression_statement (generic_expression (identifier) (type_descriptor (primitive_type)) (call_expression (identifier) (argument_list (string_literal (string_content) (escape_sequence)))) (type_descriptor (primitive_type)) (call_expression (identifier) (argument_list (string_literal (string_content) (escape_sequence)))) (type_descriptor (primitive_type)) (call_expression (identifier) (argument_list (string_literal (string_content) (escape_sequence)))) (type_descriptor (primitive_type)) (call_expression (identifier) (argument_list (string_literal (string_content) (escape_sequence)))))) (expression_statement (generic_expression (identifier) (type_descriptor (primitive_type)) (call_expression (identifier) (argument_list (string_literal (string_content) (escape_sequence)))) (type_descriptor (primitive_type)) (call_expression (identifier) (argument_list (string_literal (string_content) (escape_sequence)))) (type_descriptor (primitive_type)) (call_expression (identifier) (argument_list (string_literal (string_content) (escape_sequence)))) (type_descriptor (primitive_type)) (call_expression (identifier) (argument_list (string_literal (string_content) (escape_sequence)))))) (expression_statement (generic_expression (identifier) (type_descriptor (primitive_type)) (call_expression (identifier) (argument_list (string_literal (string_content) (escape_sequence)))) (type_descriptor (primitive_type)) (call_expression (identifier) (argument_list (string_literal (string_content) (escape_sequence)))) (type_descriptor (primitive_type)) (call_expression (identifier) (argument_list (string_literal (string_content) (escape_sequence)))) (type_descriptor (primitive_type)) (call_expression (identifier) (argument_list (string_literal (string_content) (escape_sequence)))))) (return_statement (number_literal))))) ================================================================================ Noreturn Type Qualifier ================================================================================ _Noreturn void kill(void) { printf("Killing the program\n"); exit(0); } -------------------------------------------------------------------------------- (translation_unit (function_definition (type_qualifier) (primitive_type) (function_declarator (identifier) (parameter_list (parameter_declaration (primitive_type)))) (compound_statement (expression_statement (call_expression (identifier) (argument_list (string_literal (string_content) (escape_sequence))))) (expression_statement (call_expression (identifier) (argument_list (number_literal))))))) ================================================================================ Restrict Type Qualifier ================================================================================ void fn (int *__restrict__ rptr) { int *ptr = rptr; *ptr = 0; } -------------------------------------------------------------------------------- (translation_unit (function_definition (primitive_type) (function_declarator (identifier) (parameter_list (parameter_declaration (primitive_type) (pointer_declarator (type_qualifier) (identifier))))) (compound_statement (declaration (primitive_type) (init_declarator (pointer_declarator (identifier)) (identifier))) (expression_statement (assignment_expression (pointer_expression (identifier)) (number_literal)))))) ================================================================================ Ternary ================================================================================ void f() { 0 ? 1 : 2; a = 0 ? 1 : 2; } -------------------------------------------------------------------------------- (translation_unit (function_definition (primitive_type) (function_declarator (identifier) (parameter_list)) (compound_statement (expression_statement (conditional_expression (number_literal) (number_literal) (number_literal))) (expression_statement (assignment_expression (identifier) (conditional_expression (number_literal) (number_literal) (number_literal)))))))