fix: impatient loading order

This commit is contained in:
nullchilly
2022-08-07 12:26:15 +07:00
committed by Sidhanth Rathod
parent 20f45c3962
commit aee1c8b830
67 changed files with 97276 additions and 4 deletions

View File

@@ -0,0 +1,178 @@
========================================================================
pointer declarations vs multiplications
========================================================================
int main() {
// declare a function pointer
T1 * b(T2 a);
// evaluate expressions
c * d(5);
e(f * g);
}
---
(translation_unit (function_definition
(primitive_type)
(function_declarator (identifier) (parameter_list))
(compound_statement
(comment)
(declaration
(type_identifier)
(pointer_declarator (function_declarator
(identifier)
(parameter_list (parameter_declaration (type_identifier) (identifier))))))
(comment)
(expression_statement (binary_expression
(identifier)
(call_expression (identifier) (argument_list (number_literal)))))
(expression_statement (call_expression
(identifier)
(argument_list (binary_expression (identifier) (identifier))))))))
========================================================================
casts vs multiplications
========================================================================
/*
* ambiguities
*/
int main() {
// cast
a((B *)c);
// parenthesized product
d((e * f));
}
---
(translation_unit
(comment)
(function_definition
(primitive_type)
(function_declarator (identifier) (parameter_list))
(compound_statement
(comment)
(expression_statement (call_expression
(identifier)
(argument_list (cast_expression (type_descriptor (type_identifier) (abstract_pointer_declarator)) (identifier)))))
(comment)
(expression_statement (call_expression
(identifier)
(argument_list (parenthesized_expression (binary_expression (identifier) (identifier)))))))))
========================================================================
function-like type macros vs function calls
========================================================================
// this is a macro
GIT_INLINE(int *) x = 5;
---
(translation_unit
(comment)
(declaration
(macro_type_specifier (identifier) (type_descriptor (primitive_type) (abstract_pointer_declarator)))
(init_declarator (identifier) (number_literal))))
========================================================================
function calls vs parenthesized declarators vs macro types
========================================================================
int main() {
/*
* Could be either:
* - function call
* - declaration w/ parenthesized declarator
* - declaration w/ macro type, no declarator
*/
ABC(d);
/*
* Normal declaration
*/
efg hij;
}
---
(translation_unit
(function_definition
(primitive_type)
(function_declarator (identifier) (parameter_list))
(compound_statement
(comment)
(expression_statement (call_expression (identifier) (argument_list (identifier))))
(comment)
(declaration (type_identifier) (identifier)))))
========================================================================
Call expressions vs empty declarations w/ macros as types
========================================================================
int main() {
int a = 1;
b(a);
A(A *);
}
---
(translation_unit
(function_definition
(primitive_type)
(function_declarator (identifier) (parameter_list))
(compound_statement
(declaration (primitive_type) (init_declarator (identifier) (number_literal)))
(expression_statement (call_expression (identifier) (argument_list (identifier))))
(macro_type_specifier
(identifier)
(type_descriptor (type_identifier) (abstract_pointer_declarator))))))
========================================================================
Comments after for loops with ambiguities
========================================================================
int main() {
for (a *b = c; d; e) {
aff;
}
// a-comment
g;
}
---
(translation_unit (function_definition
(primitive_type)
(function_declarator (identifier) (parameter_list))
(compound_statement
(for_statement
(declaration (type_identifier) (init_declarator
(pointer_declarator (identifier))
(identifier)))
(identifier)
(identifier)
(compound_statement
(expression_statement (identifier))))
(comment)
(expression_statement (identifier)))))
===============================================
Top-level macro invocations
===============================================
DEFINE_SOMETHING(THING_A, "this is a thing a");
DEFINE_SOMETHING(THING_B, "this is a thing b", "thanks");
---
(translation_unit
(expression_statement (call_expression (identifier) (argument_list (identifier) (string_literal))))
(expression_statement (call_expression (identifier) (argument_list (identifier) (string_literal) (string_literal)))))

View File

@@ -0,0 +1,13 @@
============================================
Line comments with escaped CRLF line endings
============================================
// hello \
this is still a comment
this_is_not a_comment;
---
(translation_unit
(comment)
(declaration (type_identifier) (identifier)))

View File

@@ -0,0 +1,530 @@
============================================
Struct declarations
============================================
struct s1;
struct s2 {
int x;
float y : 5;
};
---
(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))))))
============================================
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,
};
---
(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)))))
======================================================
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;
---
(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)))
============================================
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;
---
(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)))
============================================
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;
}
---
(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)
(declaration
(primitive_type)
(function_declarator (identifier) (parameter_list))))
(linkage_specification
(string_literal)
(function_definition
(primitive_type)
(function_declarator (identifier) (parameter_list))
(compound_statement (return_statement (number_literal)))))
(linkage_specification
(string_literal)
(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;
---
(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))))
================================
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();
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]];
---
(translation_unit
(declaration
(storage_class_specifier)
(attribute_specifier
(argument_list
(call_expression
(identifier) (argument_list (string_literal)))))
(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))) (identifier)))
(primitive_type) (function_declarator (identifier) (parameter_list)))
(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))))
(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))))))

View File

@@ -0,0 +1,518 @@
============================================
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,
};
---
(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)
))))
============================================
Identifiers
============================================
int main() {
_abc;
d_EG123;
}
---
(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);
}
---
(translation_unit
(function_definition
(primitive_type)
(function_declarator (identifier) (parameter_list))
(compound_statement
(expression_statement (call_expression
(identifier)
(argument_list (string_literal (escape_sequence)) (identifier)))))))
============================================
String literals
============================================
int main() {
"a";
"b" "c" "d";
"\"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))
(expression_statement (concatenated_string (string_literal) (string_literal) (string_literal)))
(expression_statement (string_literal (escape_sequence) (escape_sequence)))
(expression_statement (string_literal))
(expression_statement (string_literal))
(expression_statement (string_literal))
(expression_statement (string_literal)))))
============================================
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))
(expression_statement (char_literal (escape_sequence)))
(expression_statement (char_literal (escape_sequence)))
(expression_statement (char_literal (escape_sequence)))
(expression_statement (char_literal))
(expression_statement (char_literal))
(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;
}
---
(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))))))
============================================
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 * ());
}
---
(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)))))))))
============================================
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) (char_literal))))))))
============================================
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))

View File

@@ -0,0 +1,187 @@
================================
declaration specs
================================
struct __declspec(dllexport) s2
{
};
union __declspec(noinline) u2 {
};
---
(translation_unit
(struct_specifier
(ms_declspec_modifier
(identifier))
name: (type_identifier)
body: (field_declaration_list))
(union_specifier
(ms_declspec_modifier
(identifier))
name: (type_identifier)
body: (field_declaration_list)))
================================
pointers
================================
struct s2
{
int * __restrict x;
int * __sptr psp;
int * __uptr pup;
int * __unaligned pup;
};
void sum2(int n, int * __restrict a, int * __restrict b,
int * c, int * d) {
int i;
for (i = 0; i < n; i++) {
a[i] = b[i] + c[i];
c[i] = b[i] + d[i];
}
}
void MyFunction(char * __uptr myValue);
---
(translation_unit
(struct_specifier
name: (type_identifier)
body: (field_declaration_list
(field_declaration
type: (primitive_type)
declarator: (pointer_declarator
(ms_pointer_modifier
(ms_restrict_modifier))
declarator: (field_identifier)))
(field_declaration
type: (primitive_type)
declarator: (pointer_declarator
(ms_pointer_modifier
(ms_signed_ptr_modifier))
declarator: (field_identifier)))
(field_declaration
type: (primitive_type)
declarator: (pointer_declarator
(ms_pointer_modifier
(ms_unsigned_ptr_modifier))
declarator: (field_identifier)))
(field_declaration
type: (primitive_type)
declarator: (pointer_declarator
(ms_pointer_modifier
(ms_unaligned_ptr_modifier))
declarator: (field_identifier)))))
(function_definition
type: (primitive_type)
declarator: (function_declarator
declarator: (identifier)
parameters: (parameter_list
(parameter_declaration
type: (primitive_type)
declarator: (identifier))
(parameter_declaration
type: (primitive_type)
declarator: (pointer_declarator
(ms_pointer_modifier
(ms_restrict_modifier))
declarator: (identifier)))
(parameter_declaration
type: (primitive_type)
declarator: (pointer_declarator
(ms_pointer_modifier
(ms_restrict_modifier))
declarator: (identifier)))
(parameter_declaration
type: (primitive_type)
declarator: (pointer_declarator
declarator: (identifier)))
(parameter_declaration
type: (primitive_type)
declarator: (pointer_declarator
declarator: (identifier)))))
body: (compound_statement
(declaration
type: (primitive_type)
declarator: (identifier))
(for_statement
initializer: (assignment_expression
left: (identifier)
right: (number_literal))
condition: (binary_expression
left: (identifier)
right: (identifier))
update: (update_expression
argument: (identifier))
body: (compound_statement
(expression_statement
(assignment_expression
left: (subscript_expression
argument: (identifier)
index: (identifier))
right: (binary_expression
left: (subscript_expression
argument: (identifier)
index: (identifier))
right: (subscript_expression
argument: (identifier)
index: (identifier)))))
(expression_statement
(assignment_expression
left: (subscript_expression
argument: (identifier)
index: (identifier))
right: (binary_expression
left: (subscript_expression
argument: (identifier)
index: (identifier))
right: (subscript_expression
argument: (identifier)
index: (identifier)))))))))
(declaration
type: (primitive_type)
declarator: (function_declarator
declarator: (identifier)
parameters: (parameter_list
(parameter_declaration
type: (primitive_type)
declarator: (pointer_declarator
(ms_pointer_modifier
(ms_unsigned_ptr_modifier))
declarator: (identifier)))))))
================================
call modifiers
================================
__cdecl void mymethod(){
return;
}
__fastcall void mymethod(){
return;
}
---
(translation_unit
(function_definition
(ms_call_modifier)
type: (primitive_type)
declarator: (function_declarator
declarator: (identifier)
parameters: (parameter_list))
body: (compound_statement
(return_statement)))
(function_definition
(ms_call_modifier)
type: (primitive_type)
declarator: (function_declarator
declarator: (identifier)
parameters: (parameter_list))
body: (compound_statement
(return_statement))))

View File

@@ -0,0 +1,274 @@
============================================
Include directives
============================================
#include "some/path.h"
#include <stdint.h>
#include MACRO
#include MACRO(arg1, arg2)
---
(translation_unit
(preproc_include path: (string_literal))
(preproc_include path: (system_lib_string))
(preproc_include path: (identifier))
(preproc_include path:
(call_expression
function: (identifier)
arguments: (argument_list (identifier) (identifier)))))
============================================
Object-like macro definitions
============================================
#define ONE
#define TWO int a = b;
#define THREE \
c == d ? \
e : \
f
#define FOUR (mno * pq)
#define FIVE(a,b) x \
+ y
#define SIX(a, \
b) x \
+ y
---
(translation_unit
(preproc_def name: (identifier))
(preproc_def name: (identifier) value: (preproc_arg))
(preproc_def name: (identifier) value: (preproc_arg))
(preproc_def name: (identifier) value: (preproc_arg))
(preproc_function_def name: (identifier) parameters: (preproc_params (identifier) (identifier)) value: (preproc_arg))
(preproc_function_def name: (identifier) parameters: (preproc_params (identifier) (identifier)) value: (preproc_arg)))
============================================
Function-like macro definitions
============================================
#define ONE() a
#define TWO(b) c
#define THREE(d, e) f
#define FOUR(...) g
#define FIVE(h, i, ...) j
---
(translation_unit
(preproc_function_def
name: (identifier)
parameters: (preproc_params)
value: (preproc_arg))
(preproc_function_def
name: (identifier)
parameters: (preproc_params (identifier))
value: (preproc_arg))
(preproc_function_def
name: (identifier)
parameters: (preproc_params (identifier) (identifier))
value: (preproc_arg))
(preproc_function_def
name: (identifier)
parameters: (preproc_params)
value: (preproc_arg))
(preproc_function_def
name: (identifier)
parameters: (preproc_params (identifier) (identifier))
value: (preproc_arg)))
============================================
Ifdefs
============================================
#ifndef DEFINE1
int j;
#endif
#ifdef DEFINE2
ssize_t b;
#define c 32
#elif defined DEFINE3
#else
int b;
#define c 16
#endif
#ifdef DEFINE2
#else
# ifdef DEFINE3
# else
# endif
#endif
---
(translation_unit
(preproc_ifdef
name: (identifier)
(declaration
type: (primitive_type)
declarator: (identifier)))
(preproc_ifdef
name: (identifier)
(declaration
type: (primitive_type)
declarator: (identifier))
(preproc_def
name: (identifier)
value: (preproc_arg))
alternative: (preproc_elif
condition: (preproc_defined (identifier))
alternative: (preproc_else
(declaration
type: (primitive_type)
declarator: (identifier))
(preproc_def
name: (identifier)
value: (preproc_arg)))))
(preproc_ifdef
name: (identifier)
alternative: (preproc_else
(preproc_ifdef
name: (identifier)
alternative: (preproc_else)))))
===============================================================
General if blocks
==========================================
#if defined(__GNUC__) && defined(__PIC__)
#define inline inline __attribute__((always_inline))
#elif defined(_WIN32)
#define something
#elif !defined(SOMETHING_ELSE)
#define SOMETHING_ELSE
#else
#include <something>
#endif
---
(translation_unit
(preproc_if
condition: (binary_expression
left: (preproc_defined (identifier))
right: (preproc_defined (identifier)))
(preproc_def
name: (identifier)
value: (preproc_arg))
alternative: (preproc_elif
condition: (preproc_defined (identifier))
(preproc_def
name: (identifier))
alternative: (preproc_elif
condition: (unary_expression
argument: (preproc_defined (identifier)))
(preproc_def
name: (identifier))
alternative: (preproc_else
(preproc_include path: (system_lib_string)))))))
============================================
Preprocessor conditionals in functions
============================================
int main() {
#if d
puts("1");
#else
puts("2");
#endif
#if a
return 0;
#elif b
return 1;
#elif c
return 2;
#else
return 3;
#endif
}
---
(translation_unit
(function_definition
(primitive_type)
(function_declarator (identifier) (parameter_list))
(compound_statement
(preproc_if
(identifier)
(expression_statement (call_expression (identifier) (argument_list (string_literal))))
(preproc_else
(expression_statement (call_expression (identifier) (argument_list (string_literal))))))
(preproc_if
(identifier)
(return_statement (number_literal))
(preproc_elif
(identifier)
(return_statement (number_literal))
(preproc_elif
(identifier)
(return_statement (number_literal))
(preproc_else
(return_statement (number_literal)))))))))
=================================================
Preprocessor conditionals in struct/union bodies
=================================================
struct S {
#ifdef _WIN32
LONG f2;
#else
uint32_t f2;
#endif
};
---
(translation_unit
(struct_specifier (type_identifier) (field_declaration_list
(preproc_ifdef (identifier)
(field_declaration (type_identifier) (field_identifier))
(preproc_else
(field_declaration (primitive_type) (field_identifier)))))))
====================================
Unknown preprocessor directives
====================================
#pragma mark - UIViewController
---
(translation_unit (preproc_call
directive: (preproc_directive)
argument: (preproc_arg)))
======================================
Preprocessor expressions
======================================
#if A(B || C) && \
!D(F)
uint32_t a;
#endif
---
(translation_unit
(preproc_if
(binary_expression
(call_expression (identifier) (argument_list (binary_expression (identifier) (identifier))))
(unary_expression
(call_expression (identifier) (argument_list (identifier)))))
(declaration (primitive_type) (identifier))))

View File

@@ -0,0 +1,326 @@
============================================
If statements
============================================
int main() {
if (a)
1;
if (!a) {
2;
} else {
3;
}
}
---
(translation_unit
(function_definition
(primitive_type)
(function_declarator (identifier) (parameter_list))
(compound_statement
(if_statement (parenthesized_expression (identifier))
(expression_statement (number_literal)))
(if_statement (parenthesized_expression (unary_expression (identifier)))
(compound_statement
(expression_statement (number_literal)))
(compound_statement
(expression_statement (number_literal)))))))
============================================
For loops
============================================
int main() {
for (;;)
1;
for (int i = 0; i < 5; next(), i++) {
2;
}
for (start(); check(); step())
3;
for (i = 0, j = 0, k = 0, l = 0; i < 1, j < 1; i++, j++, k++, l++)
1;
}
---
(translation_unit
(function_definition
(primitive_type)
(function_declarator (identifier) (parameter_list))
(compound_statement
(for_statement
(expression_statement (number_literal)))
(for_statement
(declaration (primitive_type) (init_declarator (identifier) (number_literal)))
(binary_expression (identifier) (number_literal))
(comma_expression
(call_expression (identifier) (argument_list))
(update_expression (identifier)))
(compound_statement (expression_statement (number_literal))))
(for_statement
(call_expression (identifier) (argument_list))
(call_expression (identifier) (argument_list))
(call_expression (identifier) (argument_list))
(expression_statement (number_literal)))
(for_statement
(comma_expression
(assignment_expression (identifier) (number_literal))
(comma_expression
(assignment_expression (identifier) (number_literal))
(comma_expression
(assignment_expression (identifier) (number_literal))
(assignment_expression (identifier) (number_literal)))))
(comma_expression
(binary_expression
(identifier)
(number_literal))
(binary_expression
(identifier)
(number_literal)))
(comma_expression
(update_expression (identifier))
(comma_expression
(update_expression (identifier))
(comma_expression
(update_expression (identifier))
(update_expression (identifier)))))
(expression_statement (number_literal))))))
============================================
While loops
============================================
int main() {
while (x)
printf("hi");
}
---
(translation_unit
(function_definition
(primitive_type)
(function_declarator (identifier) (parameter_list))
(compound_statement
(while_statement (parenthesized_expression (identifier))
(expression_statement (call_expression
(identifier)
(argument_list (string_literal))))))))
============================================
Labeled statements
============================================
void foo(T *t) {
recur:
t = t->next();
if (t) goto recur;
}
---
(translation_unit
(function_definition
(primitive_type)
(function_declarator (identifier) (parameter_list
(parameter_declaration (type_identifier) (pointer_declarator (identifier)))))
(compound_statement
(labeled_statement (statement_identifier)
(expression_statement (assignment_expression
(identifier)
(call_expression (field_expression (identifier) (field_identifier)) (argument_list)))))
(if_statement (parenthesized_expression (identifier)) (goto_statement (statement_identifier))))))
============================================
Switch statements
============================================
void foo(int a) {
switch (a) {
puts("entered switch!");
case 3:
case 5:
if (b) {
c();
}
break;
default:
c();
break;
}
}
---
(translation_unit
(function_definition
(primitive_type)
(function_declarator (identifier) (parameter_list
(parameter_declaration (primitive_type) (identifier))))
(compound_statement
(switch_statement
(parenthesized_expression (identifier))
(compound_statement
(expression_statement (call_expression (identifier) (argument_list (string_literal))))
(case_statement (number_literal))
(case_statement (number_literal)
(if_statement
(parenthesized_expression (identifier))
(compound_statement (expression_statement (call_expression (identifier) (argument_list)))))
(break_statement))
(case_statement
(expression_statement (call_expression (identifier) (argument_list)))
(break_statement)))))))
============================================
Case statements separate from switch statements
============================================
int main() {
switch (count % 8) {
case 0:
do {
*to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
} while (--n > 0);
}
}
---
(translation_unit
(function_definition
(primitive_type)
(function_declarator (identifier) (parameter_list))
(compound_statement
(switch_statement
(parenthesized_expression (binary_expression (identifier) (number_literal)))
(compound_statement
(case_statement (number_literal)
(do_statement
(compound_statement
(expression_statement (assignment_expression
(pointer_expression (identifier))
(pointer_expression (update_expression (identifier)))))
(case_statement (number_literal)
(expression_statement (assignment_expression
(pointer_expression (identifier))
(pointer_expression (update_expression (identifier))))))
(case_statement (number_literal)
(expression_statement (assignment_expression
(pointer_expression (identifier))
(pointer_expression (update_expression (identifier)))))))
(parenthesized_expression (binary_expression (update_expression (identifier)) (number_literal))))))))))
============================================
Return statements
============================================
void foo() {
return;
return a;
return a, b;
}
---
(translation_unit
(function_definition
(primitive_type)
(function_declarator (identifier) (parameter_list))
(compound_statement
(return_statement)
(return_statement (identifier))
(return_statement (comma_expression (identifier) (identifier))))))
============================================
Comments with asterisks
============================================
/*************************
* odd number of asterisks
*************************/
int a;
/**************************
* even number of asterisks
**************************/
int b;
---
(translation_unit
(comment)
(declaration (primitive_type) (identifier))
(comment)
(declaration (primitive_type) (identifier)))
============================================
Attributes
============================================
void f() {
[[a]] switch (b) {
[[c]] case 1: {}
case 2:
[[fallthrough]];
default:
}
[[a]] while (true) {}
[[a]] if (true) {}
[[a]] for (;;) {}
[[a]] return;
[[a]] a;
[[a]];
[[a]] label: {}
[[a]] goto label;
// these are c++ specific, but their bind locations should be c-compatible
if (true) [[likely]] {} else [[unlikely]] {}
do [[likely]] {} while (true);
}
---
(translation_unit
(function_definition (primitive_type)
(function_declarator (identifier) (parameter_list))
(compound_statement
(attributed_statement
(attribute_declaration (attribute (identifier)))
(switch_statement
(parenthesized_expression (identifier))
(compound_statement
(attributed_statement
(attribute_declaration (attribute (identifier)))
(case_statement (number_literal) (compound_statement)))
(case_statement (number_literal)
(attributed_statement
(attribute_declaration (attribute (identifier)))
(expression_statement)))
(case_statement))))
(attributed_statement (attribute_declaration (attribute (identifier))) (while_statement (parenthesized_expression (true)) (compound_statement)))
(attributed_statement (attribute_declaration (attribute (identifier))) (if_statement (parenthesized_expression (true)) (compound_statement)))
(attributed_statement (attribute_declaration (attribute (identifier))) (for_statement (compound_statement)))
(attributed_statement (attribute_declaration (attribute (identifier))) (return_statement))
(attributed_statement (attribute_declaration (attribute (identifier))) (expression_statement (identifier)))
(attributed_statement (attribute_declaration (attribute (identifier))) (expression_statement))
(attributed_statement (attribute_declaration (attribute (identifier))) (labeled_statement (statement_identifier) (compound_statement)))
(attributed_statement (attribute_declaration (attribute (identifier))) (goto_statement (statement_identifier)))
(comment)
(if_statement
(parenthesized_expression (true))
(attributed_statement (attribute_declaration (attribute (identifier))) (compound_statement))
(attributed_statement (attribute_declaration (attribute (identifier))) (compound_statement)))
(do_statement
(attributed_statement (attribute_declaration (attribute (identifier))) (compound_statement))
(parenthesized_expression (true))))))

View File

@@ -0,0 +1,80 @@
========================================
Primitive types
========================================
int a;
uint8_t a;
uint16_t a;
uint32_t a;
uint64_t a;
uintptr_t a;
int8_t a;
int16_t a;
int32_t a;
int64_t a;
intptr_t a;
char16_t a;
char32_t a;
size_t a;
ssize_t a;
---
(translation_unit
(declaration (primitive_type) (identifier))
(declaration (primitive_type) (identifier))
(declaration (primitive_type) (identifier))
(declaration (primitive_type) (identifier))
(declaration (primitive_type) (identifier))
(declaration (primitive_type) (identifier))
(declaration (primitive_type) (identifier))
(declaration (primitive_type) (identifier))
(declaration (primitive_type) (identifier))
(declaration (primitive_type) (identifier))
(declaration (primitive_type) (identifier))
(declaration (primitive_type) (identifier))
(declaration (primitive_type) (identifier))
(declaration (primitive_type) (identifier))
(declaration (primitive_type) (identifier)))
========================================
Type modifiers
========================================
void f(unsigned);
void f(unsigned int);
void f(signed long int);
void f(unsigned v1);
void f(unsigned long v2);
---
(translation_unit
(declaration
(primitive_type)
(function_declarator
(identifier)
(parameter_list (parameter_declaration (sized_type_specifier)))))
(declaration
(primitive_type)
(function_declarator
(identifier)
(parameter_list (parameter_declaration (sized_type_specifier (primitive_type))))))
(declaration
(primitive_type)
(function_declarator
(identifier)
(parameter_list (parameter_declaration (sized_type_specifier (primitive_type))))))
(declaration
(primitive_type)
(function_declarator
(identifier)
(parameter_list (parameter_declaration (sized_type_specifier) (identifier)))))
(declaration
(primitive_type)
(function_declarator
(identifier)
(parameter_list (parameter_declaration (sized_type_specifier) (identifier))))))