difftastic/test/corpus/expressions.txt

1299 lines
37 KiB
Plaintext

================================================================================
Scoped function calls
================================================================================
int main() {
abc::def("hello", "world");
}
--------------------------------------------------------------------------------
(translation_unit
(function_definition
(primitive_type)
(function_declarator
(identifier)
(parameter_list))
(compound_statement
(expression_statement
(call_expression
(qualified_identifier
(namespace_identifier)
(identifier))
(argument_list
(string_literal
(string_content))
(string_literal
(string_content))))))))
================================================================================
Compound literals without parentheses
================================================================================
T x = T{0};
U<V> y = U<V>{0};
int x = int{1};
--------------------------------------------------------------------------------
(translation_unit
(declaration
(type_identifier)
(init_declarator
(identifier)
(compound_literal_expression
(type_identifier)
(initializer_list
(number_literal)))))
(declaration
(template_type
(type_identifier)
(template_argument_list
(type_descriptor
(type_identifier))))
(init_declarator
(identifier)
(compound_literal_expression
(template_type
(type_identifier)
(template_argument_list
(type_descriptor
(type_identifier))))
(initializer_list
(number_literal)))))
(declaration
(primitive_type)
(init_declarator
(identifier)
(compound_literal_expression
(primitive_type)
(initializer_list
(number_literal))))))
================================================================================
Explicit destructor calls
================================================================================
int main() {
foo.~Foo();
bar->~Bar();
}
--------------------------------------------------------------------------------
(translation_unit
(function_definition
(primitive_type)
(function_declarator
(identifier)
(parameter_list))
(compound_statement
(expression_statement
(call_expression
(field_expression
(identifier)
(destructor_name
(identifier)))
(argument_list)))
(expression_statement
(call_expression
(field_expression
(identifier)
(destructor_name
(identifier)))
(argument_list))))))
================================================================================
New and Delete expressions
================================================================================
int main() {
auto a = new T();
auto b = new U::V<W, X>{};
auto c = new (&d) T;
auto d = new T[5][3]();
auto e = new int[5];
d = new(2, f) T;
delete a;
::delete[] c;
::new (foo(x)) T(this, x);
}
--------------------------------------------------------------------------------
(translation_unit
(function_definition
(primitive_type)
(function_declarator
(identifier)
(parameter_list))
(compound_statement
(declaration
(placeholder_type_specifier
(auto))
(init_declarator
(identifier)
(new_expression
(type_identifier)
(argument_list))))
(declaration
(placeholder_type_specifier
(auto))
(init_declarator
(identifier)
(new_expression
(qualified_identifier
(namespace_identifier)
(template_type
(type_identifier)
(template_argument_list
(type_descriptor
(type_identifier))
(type_descriptor
(type_identifier)))))
(initializer_list))))
(declaration
(placeholder_type_specifier
(auto))
(init_declarator
(identifier)
(new_expression
(argument_list
(pointer_expression
(identifier)))
(type_identifier))))
(declaration
(placeholder_type_specifier
(auto))
(init_declarator
(identifier)
(new_expression
(type_identifier)
(new_declarator
(number_literal)
(new_declarator
(number_literal)))
(argument_list))))
(declaration
(placeholder_type_specifier
(auto))
(init_declarator
(identifier)
(new_expression
(primitive_type)
(new_declarator
(number_literal)))))
(expression_statement
(assignment_expression
(identifier)
(new_expression
(argument_list
(number_literal)
(identifier))
(type_identifier))))
(expression_statement
(delete_expression
(identifier)))
(expression_statement
(delete_expression
(identifier)))
(expression_statement
(new_expression
(argument_list
(call_expression
(identifier)
(argument_list
(identifier))))
(type_identifier)
(argument_list
(this)
(identifier)))))))
================================================================================
Initializer lists as arguments
================================================================================
int main() {
pairs.push_back({true, false});
}
--------------------------------------------------------------------------------
(translation_unit
(function_definition
(primitive_type)
(function_declarator
(identifier)
(parameter_list))
(compound_statement
(expression_statement
(call_expression
(field_expression
(identifier)
(field_identifier))
(argument_list
(initializer_list
(true)
(false))))))))
================================================================================
Lambda expressions
================================================================================
auto f = [&](int x) -> bool {
return true;
};
auto g = [x, y](int z) {
return false;
};
auto h = [] {
return false;
};
auto i = [] <typename T> () {
return T();
};
auto i = [] <typename T> requires Hashable<T> {
return T();
};
--------------------------------------------------------------------------------
(translation_unit
(declaration
(placeholder_type_specifier
(auto))
(init_declarator
(identifier)
(lambda_expression
(lambda_capture_specifier
(lambda_default_capture))
(abstract_function_declarator
(parameter_list
(parameter_declaration
(primitive_type)
(identifier)))
(trailing_return_type
(type_descriptor
(primitive_type))))
(compound_statement
(return_statement
(true))))))
(declaration
(placeholder_type_specifier
(auto))
(init_declarator
(identifier)
(lambda_expression
(lambda_capture_specifier
(identifier)
(identifier))
(abstract_function_declarator
(parameter_list
(parameter_declaration
(primitive_type)
(identifier))))
(compound_statement
(return_statement
(false))))))
(declaration
(placeholder_type_specifier
(auto))
(init_declarator
(identifier)
(lambda_expression
(lambda_capture_specifier)
(compound_statement
(return_statement
(false))))))
(declaration
(placeholder_type_specifier
(auto))
(init_declarator
(identifier)
(lambda_expression
(lambda_capture_specifier)
(template_parameter_list
(type_parameter_declaration
(type_identifier)))
(abstract_function_declarator
(parameter_list))
(compound_statement
(return_statement
(call_expression
(identifier)
(argument_list)))))))
(declaration
(placeholder_type_specifier
(auto))
(init_declarator
(identifier)
(lambda_expression
(lambda_capture_specifier)
(template_parameter_list
(type_parameter_declaration
(type_identifier)))
(requires_clause
(template_type
(type_identifier)
(template_argument_list
(type_descriptor
(type_identifier)))))
(compound_statement
(return_statement
(call_expression
(identifier)
(argument_list))))))))
================================================================================
Nested template calls
================================================================================
class A {
A() : T::template Nested<int>::type() {}
A() : T::template Nested<int>::template Nested2<float>::type() {}
B<C::D<E, F>>::G field;
using B<C>::template D<int>;
H<I<J>> method() {
K::L<M<N>> variable1 = K::L<M<N>>{};
typename K::template L<M<N>>::type variable2;
typename K::template L<M<N>>::template O<P>::type variable3;
}
typename Z::template Nested<int>::type x;
typename X::template Nested<int>::Y::template Nested2<D> x;
};
--------------------------------------------------------------------------------
(translation_unit
(class_specifier
(type_identifier)
(field_declaration_list
(function_definition
(function_declarator
(identifier)
(parameter_list))
(field_initializer_list
(field_initializer
(qualified_identifier
(namespace_identifier)
(qualified_identifier
(dependent_name
(template_type
(type_identifier)
(template_argument_list
(type_descriptor
(primitive_type)))))
(field_identifier)))
(argument_list)))
(compound_statement))
(function_definition
(function_declarator
(identifier)
(parameter_list))
(field_initializer_list
(field_initializer
(qualified_identifier
(namespace_identifier)
(qualified_identifier
(dependent_name
(template_type
(type_identifier)
(template_argument_list
(type_descriptor
(primitive_type)))))
(qualified_identifier
(dependent_name
(template_type
(type_identifier)
(template_argument_list
(type_descriptor
(primitive_type)))))
(field_identifier))))
(argument_list)))
(compound_statement))
(field_declaration
(qualified_identifier
(template_type
(type_identifier)
(template_argument_list
(type_descriptor
(qualified_identifier
(namespace_identifier)
(template_type
(type_identifier)
(template_argument_list
(type_descriptor
(type_identifier))
(type_descriptor
(type_identifier))))))))
(type_identifier))
(field_identifier))
(using_declaration
(qualified_identifier
(template_type
(type_identifier)
(template_argument_list
(type_descriptor
(type_identifier))))
(dependent_name
(template_function
(identifier)
(template_argument_list
(type_descriptor
(primitive_type)))))))
(function_definition
(template_type
(type_identifier)
(template_argument_list
(type_descriptor
(template_type
(type_identifier)
(template_argument_list
(type_descriptor
(type_identifier)))))))
(function_declarator
(field_identifier)
(parameter_list))
(compound_statement
(declaration
(qualified_identifier
(namespace_identifier)
(template_type
(type_identifier)
(template_argument_list
(type_descriptor
(template_type
(type_identifier)
(template_argument_list
(type_descriptor
(type_identifier))))))))
(init_declarator
(identifier)
(compound_literal_expression
(qualified_identifier
(namespace_identifier)
(template_type
(type_identifier)
(template_argument_list
(type_descriptor
(template_type
(type_identifier)
(template_argument_list
(type_descriptor
(type_identifier))))))))
(initializer_list))))
(declaration
(dependent_type
(qualified_identifier
(namespace_identifier)
(qualified_identifier
(dependent_name
(template_type
(type_identifier)
(template_argument_list
(type_descriptor
(template_type
(type_identifier)
(template_argument_list
(type_descriptor
(type_identifier))))))))
(type_identifier))))
(identifier))
(declaration
(dependent_type
(qualified_identifier
(namespace_identifier)
(qualified_identifier
(dependent_name
(template_type
(type_identifier)
(template_argument_list
(type_descriptor
(template_type
(type_identifier)
(template_argument_list
(type_descriptor
(type_identifier))))))))
(qualified_identifier
(dependent_name
(template_type
(type_identifier)
(template_argument_list
(type_descriptor
(type_identifier)))))
(type_identifier)))))
(identifier))))
(field_declaration
(dependent_type
(qualified_identifier
(namespace_identifier)
(qualified_identifier
(dependent_name
(template_type
(type_identifier)
(template_argument_list
(type_descriptor
(primitive_type)))))
(type_identifier))))
(field_identifier))
(field_declaration
(dependent_type
(qualified_identifier
(namespace_identifier)
(qualified_identifier
(dependent_name
(template_type
(type_identifier)
(template_argument_list
(type_descriptor
(primitive_type)))))
(qualified_identifier
(namespace_identifier)
(dependent_name
(template_type
(type_identifier)
(template_argument_list
(type_descriptor
(type_identifier)))))))))
(field_identifier)))))
================================================================================
Comma expressions at the start of blocks
================================================================================
int main() { a(), b(); }
--------------------------------------------------------------------------------
(translation_unit
(function_definition
(primitive_type)
(function_declarator
(identifier)
(parameter_list))
(compound_statement
(expression_statement
(comma_expression
(call_expression
(identifier)
(argument_list))
(call_expression
(identifier)
(argument_list)))))))
================================================================================
Nullptr
================================================================================
void *x = nullptr;
--------------------------------------------------------------------------------
(translation_unit
(declaration
(primitive_type)
(init_declarator
(pointer_declarator
(identifier))
(null))))
================================================================================
Raw string literals
================================================================================
const char *s1 = R"(
This is a string. It ends with ')' and a quote.
)";
const char *s2 = R"FOO(
This is a string. It ends with ')FOO' and a quote.
)FOO";
const char *s3 = uR"FOO(
This is a string. It ends with ')FOO' and a quote.
)FOO";
const char *s4 = UR"FOO(
This is a string. It ends with ')FOO' and a quote.
)FOO";
const char *s5 = u8R"FOO(
This is a string. It ends with ')FOO' and a quote.
)FOO";
const char *s6 = LR"FOO(
This is a string. It ends with ')FOO' and a quote.
)FOO";
--------------------------------------------------------------------------------
(translation_unit
(declaration
(type_qualifier)
(primitive_type)
(init_declarator
(pointer_declarator
(identifier))
(raw_string_literal
(raw_string_content))))
(declaration
(type_qualifier)
(primitive_type)
(init_declarator
(pointer_declarator
(identifier))
(raw_string_literal
(raw_string_delimiter)
(raw_string_content)
(raw_string_delimiter))))
(declaration
(type_qualifier)
(primitive_type)
(init_declarator
(pointer_declarator
(identifier))
(raw_string_literal
(raw_string_delimiter)
(raw_string_content)
(raw_string_delimiter))))
(declaration
(type_qualifier)
(primitive_type)
(init_declarator
(pointer_declarator
(identifier))
(raw_string_literal
(raw_string_delimiter)
(raw_string_content)
(raw_string_delimiter))))
(declaration
(type_qualifier)
(primitive_type)
(init_declarator
(pointer_declarator
(identifier))
(raw_string_literal
(raw_string_delimiter)
(raw_string_content)
(raw_string_delimiter))))
(declaration
(type_qualifier)
(primitive_type)
(init_declarator
(pointer_declarator
(identifier))
(raw_string_literal
(raw_string_delimiter)
(raw_string_content)
(raw_string_delimiter)))))
================================================================================
Template calls
================================================================================
int main() {
// '<' and '>' as template argument list delimiters
if (a<b && c>()) {}
// '<' and '>' as binary operators
if (a < b && c >= d) {}
Q::template R<S>();
this->template f<T>();
foo.template f<U>();
}
--------------------------------------------------------------------------------
(translation_unit
(function_definition
(primitive_type)
(function_declarator
(identifier)
(parameter_list))
(compound_statement
(comment)
(if_statement
(condition_clause
(call_expression
(template_function
(identifier)
(template_argument_list
(binary_expression
(identifier)
(identifier))))
(argument_list)))
(compound_statement))
(comment)
(if_statement
(condition_clause
(binary_expression
(binary_expression
(identifier)
(identifier))
(binary_expression
(identifier)
(identifier))))
(compound_statement))
(expression_statement
(call_expression
(qualified_identifier
(namespace_identifier)
(dependent_name
(template_function
(identifier)
(template_argument_list
(type_descriptor
(type_identifier))))))
(argument_list)))
(expression_statement
(call_expression
(field_expression
(this)
(dependent_name
(template_method
(field_identifier)
(template_argument_list
(type_descriptor
(type_identifier))))))
(argument_list)))
(expression_statement
(call_expression
(field_expression
(identifier)
(dependent_name
(template_method
(field_identifier)
(template_argument_list
(type_descriptor
(type_identifier))))))
(argument_list))))))
================================================================================
Parameter pack expansions
================================================================================
container<A,B,C...> t1;
container<C...,A,B> t2;
typedef Tuple<Pair<Args1, Args2>...> type;
f(&args...); // expands to f(&E1, &E2, &E3)
f(n, ++args...); // expands to f(n, ++E1, ++E2, ++E3);
f(++args..., n); // expands to f(++E1, ++E2, ++E3, n);
f(const_cast<const Args*>(&args)...); // f(const_cast<const E1*>(&X1), const_cast<const E2*>(&X2), const_cast<const E3*>(&X3))
f(h(args...) + args...); // expands to f(h(E1,E2,E3) + E1, h(E1,E2,E3) + E2, h(E1,E2,E3) + E3)
const int size = sizeof...(args) + 2;
int res[size] = {1,args...,2};
int dummy[sizeof...(Ts)] = { (std::cout << args, 0)... };
auto lm = [&, args...] { return g(args...); };
class X : public Mixins... {
public:
X(const Mixins&... mixins) : Mixins(mixins)... { }
};
template <typename... Args>
void wrap(Args&&... args) {
f(forward<Args>(args)...);
}
void f(T...) {}
--------------------------------------------------------------------------------
(translation_unit
(declaration
type: (template_type
name: (type_identifier)
arguments: (template_argument_list
(type_descriptor
type: (type_identifier))
(type_descriptor
type: (type_identifier))
(parameter_pack_expansion
pattern: (type_descriptor
type: (type_identifier)))))
declarator: (identifier))
(declaration
type: (template_type
name: (type_identifier)
arguments: (template_argument_list
(parameter_pack_expansion
pattern: (type_descriptor
type: (type_identifier)))
(type_descriptor
type: (type_identifier))
(type_descriptor
type: (type_identifier))))
declarator: (identifier))
(type_definition
type: (template_type
name: (type_identifier)
arguments: (template_argument_list
(parameter_pack_expansion
pattern: (type_descriptor
type: (template_type
name: (type_identifier)
arguments: (template_argument_list
(type_descriptor
type: (type_identifier))
(type_descriptor
type: (type_identifier))))))))
declarator: (type_identifier))
(expression_statement
(call_expression
function: (identifier)
arguments: (argument_list
(parameter_pack_expansion
pattern: (pointer_expression
argument: (identifier))))))
(comment)
(expression_statement
(call_expression
function: (identifier)
arguments: (argument_list
(identifier)
(parameter_pack_expansion
pattern: (update_expression
argument: (identifier))))))
(comment)
(expression_statement
(call_expression
function: (identifier)
arguments: (argument_list
(parameter_pack_expansion
pattern: (update_expression
argument: (identifier)))
(identifier))))
(comment)
(expression_statement
(call_expression
function: (identifier)
arguments: (argument_list
(parameter_pack_expansion
pattern: (call_expression
function: (template_function
name: (identifier)
arguments: (template_argument_list
(type_descriptor
(type_qualifier)
type: (type_identifier)
declarator: (abstract_pointer_declarator))))
arguments: (argument_list
(pointer_expression
argument: (identifier))))))))
(comment)
(expression_statement
(call_expression
function: (identifier)
arguments: (argument_list
(parameter_pack_expansion
pattern: (binary_expression
left: (call_expression
function: (identifier)
arguments: (argument_list
(parameter_pack_expansion
pattern: (identifier))))
right: (identifier))))))
(comment)
(declaration
(type_qualifier)
type: (primitive_type)
declarator: (init_declarator
declarator: (identifier)
value: (binary_expression
left: (sizeof_expression
value: (identifier))
right: (number_literal))))
(declaration
type: (primitive_type)
declarator: (init_declarator
declarator: (array_declarator
declarator: (identifier)
size: (identifier))
value: (initializer_list
(number_literal)
(parameter_pack_expansion
pattern: (identifier))
(number_literal))))
(declaration
type: (primitive_type)
declarator: (init_declarator
declarator: (array_declarator
declarator: (identifier)
size: (sizeof_expression
value: (identifier)))
value: (initializer_list
(parameter_pack_expansion
pattern: (parenthesized_expression
(comma_expression
left: (binary_expression
left: (qualified_identifier
scope: (namespace_identifier)
name: (identifier))
right: (identifier))
right: (number_literal)))))))
(declaration
type: (placeholder_type_specifier
(auto))
declarator: (init_declarator
declarator: (identifier)
value: (lambda_expression
captures: (lambda_capture_specifier
(lambda_default_capture)
(parameter_pack_expansion
pattern: (identifier)))
body: (compound_statement
(return_statement
(call_expression
function: (identifier)
arguments: (argument_list
(parameter_pack_expansion
pattern: (identifier)))))))))
(class_specifier
name: (type_identifier)
(base_class_clause
(access_specifier)
(type_identifier))
body: (field_declaration_list
(access_specifier)
(function_definition
declarator: (function_declarator
declarator: (identifier)
parameters: (parameter_list
(variadic_parameter_declaration
(type_qualifier)
type: (type_identifier)
declarator: (reference_declarator
(variadic_declarator
(identifier))))))
(field_initializer_list
(field_initializer
(field_identifier)
(argument_list
(identifier))))
body: (compound_statement))))
(template_declaration
parameters: (template_parameter_list
(variadic_type_parameter_declaration
(type_identifier)))
(function_definition
type: (primitive_type)
declarator: (function_declarator
declarator: (identifier)
parameters: (parameter_list
(variadic_parameter_declaration
type: (type_identifier)
declarator: (reference_declarator
(variadic_declarator
(identifier))))))
body: (compound_statement
(expression_statement
(call_expression
function: (identifier)
arguments: (argument_list
(parameter_pack_expansion
pattern: (call_expression
function: (template_function
name: (identifier)
arguments: (template_argument_list
(type_descriptor
type: (type_identifier))))
arguments: (argument_list
(identifier))))))))))
(function_definition
type: (primitive_type)
declarator: (function_declarator
declarator: (identifier)
parameters: (parameter_list
(variadic_parameter_declaration
type: (type_identifier)
declarator: (variadic_declarator))))
body: (compound_statement)))
================================================================================
Concatenated string literals
================================================================================
"a" "b" "c";
R"(a)" R"(b)" R"(c)";
"a" R"(b)" L"c" R"FOO(d)FOO";
--------------------------------------------------------------------------------
(translation_unit
(expression_statement
(concatenated_string
(string_literal
(string_content))
(string_literal
(string_content))
(string_literal
(string_content))))
(expression_statement
(concatenated_string
(raw_string_literal
(raw_string_content))
(raw_string_literal
(raw_string_content))
(raw_string_literal
(raw_string_content))))
(expression_statement
(concatenated_string
(string_literal
(string_content))
(raw_string_literal
(raw_string_content))
(string_literal
(string_content))
(raw_string_literal
(raw_string_delimiter)
(raw_string_content)
(raw_string_delimiter)))))
================================================================================
User-defined literals
================================================================================
1.2_km;
"foo" "bar"_baz;
--------------------------------------------------------------------------------
(translation_unit
(expression_statement
(user_defined_literal
(number_literal)
(literal_suffix)))
(expression_statement
(user_defined_literal
(concatenated_string
(string_literal
(string_content))
(string_literal
(string_content)))
(literal_suffix))))
================================================================================
Primitive types ctor
================================================================================
x = int(1);
x = new int(1);
x = (int(1) + float(2));
--------------------------------------------------------------------------------
(translation_unit
(expression_statement
(assignment_expression
(identifier)
(call_expression
(primitive_type)
(argument_list
(number_literal)))))
(expression_statement
(assignment_expression
(identifier)
(new_expression
(primitive_type)
(argument_list
(number_literal)))))
(expression_statement
(assignment_expression
(identifier)
(parenthesized_expression
(binary_expression
(call_expression
(primitive_type)
(argument_list
(number_literal)))
(call_expression
(primitive_type)
(argument_list
(number_literal))))))))
================================================================================
Array assignment expression
================================================================================
array_[i] = s[i];
array_[{i}] = s[{1,2,3}];
--------------------------------------------------------------------------------
(translation_unit
(expression_statement
(assignment_expression
(subscript_expression
(identifier)
(identifier))
(subscript_expression
(identifier)
(identifier))))
(expression_statement
(assignment_expression
(subscript_expression
(identifier)
(initializer_list
(identifier)))
(subscript_expression
(identifier)
(initializer_list
(number_literal)
(number_literal)
(number_literal))))))
================================================================================
Coroutines
================================================================================
co_await fn();
co_await var;
--------------------------------------------------------------------------------
(translation_unit
(expression_statement
(co_await_expression
(call_expression
(identifier)
(argument_list))))
(expression_statement
(co_await_expression
(identifier))))
================================================================================
Three-way comparison
================================================================================
auto x = a <=> b;
bool y = 0 > a <=> b;
--------------------------------------------------------------------------------
(translation_unit
(declaration
(placeholder_type_specifier
(auto))
(init_declarator
(identifier)
(binary_expression
(identifier)
(identifier))))
(declaration
(primitive_type)
(init_declarator
(identifier)
(binary_expression
(number_literal)
(binary_expression
(identifier)
(identifier))))))
================================================================================
Fold Expressions
================================================================================
bool t = (... + IndexOf<T>);
bool t2 = (IndexOf<T> + ...);
bool t3 = (1 + ... + IndexOf<T>);
bool t3 = (IndexOf<T> + ... + 1);
--------------------------------------------------------------------------------
(translation_unit
(declaration
(primitive_type)
(init_declarator
(identifier)
(fold_expression
(template_function
(identifier)
(template_argument_list
(type_descriptor
(type_identifier)))))))
(declaration
(primitive_type)
(init_declarator
(identifier)
(fold_expression
(template_function
(identifier)
(template_argument_list
(type_descriptor
(type_identifier)))))))
(declaration
(primitive_type)
(init_declarator
(identifier)
(fold_expression
(number_literal)
(template_function
(identifier)
(template_argument_list
(type_descriptor
(type_identifier)))))))
(declaration
(primitive_type)
(init_declarator
(identifier)
(fold_expression
(template_function
(identifier)
(template_argument_list
(type_descriptor
(type_identifier))))
(number_literal)))))
================================================================================
Alternative tokens (digraphs)
================================================================================
if (not marked and (x < left or right < x)) {}
operator not_eq(int) { return true; }
foo and_eq bar();
--------------------------------------------------------------------------------
(translation_unit
(if_statement
(condition_clause
(binary_expression
(unary_expression
(identifier))
(parenthesized_expression
(binary_expression
(binary_expression
(identifier)
(identifier))
(binary_expression
(identifier)
(identifier))))))
(compound_statement))
(function_definition
(function_declarator
(operator_name)
(parameter_list
(parameter_declaration
(primitive_type))))
(compound_statement
(return_statement
(true))))
(expression_statement
(assignment_expression
(identifier)
(call_expression
(identifier)
(argument_list)))))