mirror of https://github.com/Wilfred/difftastic/
2094 lines
57 KiB
Plaintext
2094 lines
57 KiB
Plaintext
================================================================================
|
|
Namespace definitions
|
|
================================================================================
|
|
|
|
namespace std {
|
|
|
|
int x;
|
|
|
|
} // namespace std
|
|
|
|
namespace A::B { }
|
|
namespace A::B::inline C { }
|
|
namespace A::B::inline C::D { }
|
|
inline namespace A { }
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(namespace_definition
|
|
name: (namespace_identifier)
|
|
body: (declaration_list
|
|
(declaration
|
|
type: (primitive_type)
|
|
declarator: (identifier))))
|
|
(comment)
|
|
(namespace_definition
|
|
name: (nested_namespace_specifier
|
|
(namespace_identifier)
|
|
(namespace_identifier))
|
|
body: (declaration_list))
|
|
(namespace_definition
|
|
name: (nested_namespace_specifier
|
|
(namespace_identifier)
|
|
(nested_namespace_specifier
|
|
(namespace_identifier)
|
|
(namespace_identifier)))
|
|
body: (declaration_list))
|
|
(namespace_definition
|
|
name: (nested_namespace_specifier
|
|
(namespace_identifier)
|
|
(nested_namespace_specifier
|
|
(namespace_identifier)
|
|
(nested_namespace_specifier
|
|
(namespace_identifier)
|
|
(namespace_identifier))))
|
|
body: (declaration_list))
|
|
(namespace_definition
|
|
name: (namespace_identifier)
|
|
body: (declaration_list)))
|
|
|
|
================================================================================
|
|
Namespace alias definitions
|
|
================================================================================
|
|
|
|
namespace A = B;
|
|
namespace C = ::D;
|
|
namespace fs = std::filesystem;
|
|
namespace bfs = ::boost::filesystem;
|
|
namespace literals = std::chono::literals;
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(namespace_alias_definition
|
|
name: (namespace_identifier)
|
|
(namespace_identifier))
|
|
(namespace_alias_definition
|
|
name: (namespace_identifier)
|
|
(nested_namespace_specifier
|
|
(namespace_identifier)))
|
|
(namespace_alias_definition
|
|
name: (namespace_identifier)
|
|
(nested_namespace_specifier
|
|
(namespace_identifier)
|
|
(namespace_identifier)))
|
|
(namespace_alias_definition
|
|
name: (namespace_identifier)
|
|
(nested_namespace_specifier
|
|
(nested_namespace_specifier
|
|
(namespace_identifier)
|
|
(namespace_identifier))))
|
|
(namespace_alias_definition
|
|
name: (namespace_identifier)
|
|
(nested_namespace_specifier
|
|
(namespace_identifier)
|
|
(nested_namespace_specifier
|
|
(namespace_identifier)
|
|
(namespace_identifier)))))
|
|
|
|
================================================================================
|
|
Using declarations
|
|
================================================================================
|
|
|
|
using a;
|
|
using ::b;
|
|
using c::d;
|
|
using ::e::f::g;
|
|
using h = i::j;
|
|
using namespace std;
|
|
using enum Foo;
|
|
|
|
template <typename T>
|
|
using a = typename b<T>::c;
|
|
|
|
using foobar [[deprecated]] = int;
|
|
using foobar [[deprecated]] [[maybe_unused]] = int;
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(using_declaration
|
|
(identifier))
|
|
(using_declaration
|
|
(qualified_identifier
|
|
(identifier)))
|
|
(using_declaration
|
|
(qualified_identifier
|
|
(namespace_identifier)
|
|
(identifier)))
|
|
(using_declaration
|
|
(qualified_identifier
|
|
(qualified_identifier
|
|
(namespace_identifier)
|
|
(qualified_identifier
|
|
(namespace_identifier)
|
|
(identifier)))))
|
|
(alias_declaration
|
|
(type_identifier)
|
|
(type_descriptor
|
|
(qualified_identifier
|
|
(namespace_identifier)
|
|
(type_identifier))))
|
|
(using_declaration
|
|
(identifier))
|
|
(using_declaration
|
|
(identifier))
|
|
(template_declaration
|
|
(template_parameter_list
|
|
(type_parameter_declaration
|
|
(type_identifier)))
|
|
(alias_declaration
|
|
(type_identifier)
|
|
(type_descriptor
|
|
(dependent_type
|
|
(qualified_identifier
|
|
(template_type
|
|
(type_identifier)
|
|
(template_argument_list
|
|
(type_descriptor
|
|
(type_identifier))))
|
|
(type_identifier))))))
|
|
(alias_declaration
|
|
(type_identifier)
|
|
(attribute_declaration
|
|
(attribute
|
|
(identifier)))
|
|
(type_descriptor
|
|
(primitive_type)))
|
|
(alias_declaration
|
|
(type_identifier)
|
|
(attribute_declaration
|
|
(attribute
|
|
(identifier)))
|
|
(attribute_declaration
|
|
(attribute
|
|
(identifier)))
|
|
(type_descriptor
|
|
(primitive_type))))
|
|
|
|
================================================================================
|
|
Reference declarations
|
|
================================================================================
|
|
|
|
int main() {
|
|
T &x = y<T &>();
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(function_definition
|
|
(primitive_type)
|
|
(function_declarator
|
|
(identifier)
|
|
(parameter_list))
|
|
(compound_statement
|
|
(declaration
|
|
(type_identifier)
|
|
(init_declarator
|
|
(reference_declarator
|
|
(identifier))
|
|
(call_expression
|
|
(template_function
|
|
(identifier)
|
|
(template_argument_list
|
|
(type_descriptor
|
|
(type_identifier)
|
|
(abstract_reference_declarator))))
|
|
(argument_list)))))))
|
|
|
|
================================================================================
|
|
R-value reference declarations
|
|
================================================================================
|
|
|
|
int main(T &&);
|
|
|
|
int main(T &&t) {
|
|
const U &&u = v;
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(declaration
|
|
(primitive_type)
|
|
(function_declarator
|
|
(identifier)
|
|
(parameter_list
|
|
(parameter_declaration
|
|
(type_identifier)
|
|
(abstract_reference_declarator)))))
|
|
(function_definition
|
|
(primitive_type)
|
|
(function_declarator
|
|
(identifier)
|
|
(parameter_list
|
|
(parameter_declaration
|
|
(type_identifier)
|
|
(reference_declarator
|
|
(identifier)))))
|
|
(compound_statement
|
|
(declaration
|
|
(type_qualifier)
|
|
(type_identifier)
|
|
(init_declarator
|
|
(reference_declarator
|
|
(identifier))
|
|
(identifier))))))
|
|
|
|
================================================================================
|
|
Inline method definitions
|
|
================================================================================
|
|
|
|
struct S {
|
|
int f;
|
|
|
|
S() : f(0) {}
|
|
|
|
private:
|
|
int getF1() const { return f; }
|
|
int getF2() const try { throw 1; } catch (...) { return f; }
|
|
};
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(struct_specifier
|
|
(type_identifier)
|
|
(field_declaration_list
|
|
(field_declaration
|
|
(primitive_type)
|
|
(field_identifier))
|
|
(function_definition
|
|
(function_declarator
|
|
(identifier)
|
|
(parameter_list))
|
|
(field_initializer_list
|
|
(field_initializer
|
|
(field_identifier)
|
|
(argument_list
|
|
(number_literal))))
|
|
(compound_statement))
|
|
(access_specifier)
|
|
(function_definition
|
|
(primitive_type)
|
|
(function_declarator
|
|
(field_identifier)
|
|
(parameter_list)
|
|
(type_qualifier))
|
|
(compound_statement
|
|
(return_statement
|
|
(identifier))))
|
|
(function_definition
|
|
(primitive_type)
|
|
(function_declarator
|
|
(field_identifier)
|
|
(parameter_list)
|
|
(type_qualifier))
|
|
(try_statement
|
|
(compound_statement
|
|
(throw_statement
|
|
(number_literal)))
|
|
(catch_clause
|
|
(parameter_list)
|
|
(compound_statement
|
|
(return_statement
|
|
(identifier)))))))))
|
|
|
|
================================================================================
|
|
Inline method definitions with overrides
|
|
================================================================================
|
|
|
|
struct B : A {
|
|
int foo() override { return 2; }
|
|
int pho() final { return 3; }
|
|
int bar() const override { return 4; }
|
|
int baz() const final { return 5; }
|
|
int bag() const final override { return 6; }
|
|
int bah() const override final;
|
|
auto bai() const -> int override { return 7; }
|
|
auto baj() const -> int override;
|
|
};
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(struct_specifier
|
|
(type_identifier)
|
|
(base_class_clause
|
|
(type_identifier))
|
|
(field_declaration_list
|
|
(function_definition
|
|
(primitive_type)
|
|
(function_declarator
|
|
(field_identifier)
|
|
(parameter_list)
|
|
(virtual_specifier))
|
|
(compound_statement
|
|
(return_statement
|
|
(number_literal))))
|
|
(function_definition
|
|
(primitive_type)
|
|
(function_declarator
|
|
(field_identifier)
|
|
(parameter_list)
|
|
(virtual_specifier))
|
|
(compound_statement
|
|
(return_statement
|
|
(number_literal))))
|
|
(function_definition
|
|
(primitive_type)
|
|
(function_declarator
|
|
(field_identifier)
|
|
(parameter_list)
|
|
(type_qualifier)
|
|
(virtual_specifier))
|
|
(compound_statement
|
|
(return_statement
|
|
(number_literal))))
|
|
(function_definition
|
|
(primitive_type)
|
|
(function_declarator
|
|
(field_identifier)
|
|
(parameter_list)
|
|
(type_qualifier)
|
|
(virtual_specifier))
|
|
(compound_statement
|
|
(return_statement
|
|
(number_literal))))
|
|
(function_definition
|
|
(primitive_type)
|
|
(function_declarator
|
|
(field_identifier)
|
|
(parameter_list)
|
|
(type_qualifier)
|
|
(virtual_specifier)
|
|
(virtual_specifier))
|
|
(compound_statement
|
|
(return_statement
|
|
(number_literal))))
|
|
(field_declaration
|
|
(primitive_type)
|
|
(function_declarator
|
|
(field_identifier)
|
|
(parameter_list)
|
|
(type_qualifier)
|
|
(virtual_specifier)
|
|
(virtual_specifier)))
|
|
(function_definition
|
|
(placeholder_type_specifier
|
|
(auto))
|
|
(function_declarator
|
|
(field_identifier)
|
|
(parameter_list)
|
|
(type_qualifier)
|
|
(trailing_return_type
|
|
(type_descriptor
|
|
(primitive_type)))
|
|
(virtual_specifier))
|
|
(compound_statement
|
|
(return_statement
|
|
(number_literal))))
|
|
(field_declaration
|
|
(placeholder_type_specifier
|
|
(auto))
|
|
(function_declarator
|
|
(field_identifier)
|
|
(parameter_list)
|
|
(type_qualifier)
|
|
(trailing_return_type
|
|
(type_descriptor
|
|
(primitive_type)))
|
|
(virtual_specifier))))))
|
|
|
|
================================================================================
|
|
Virtual method declarations
|
|
================================================================================
|
|
|
|
class A {
|
|
virtual ~Point();
|
|
void b();
|
|
virtual void foo() {}
|
|
virtual void bar();
|
|
inline virtual void foo() override;
|
|
virtual inline void foo() final;
|
|
};
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(class_specifier
|
|
(type_identifier)
|
|
(field_declaration_list
|
|
(declaration
|
|
(virtual)
|
|
(function_declarator
|
|
(destructor_name
|
|
(identifier))
|
|
(parameter_list)))
|
|
(field_declaration
|
|
(primitive_type)
|
|
(function_declarator
|
|
(field_identifier)
|
|
(parameter_list)))
|
|
(function_definition
|
|
(virtual)
|
|
(primitive_type)
|
|
(function_declarator
|
|
(field_identifier)
|
|
(parameter_list))
|
|
(compound_statement))
|
|
(field_declaration
|
|
(virtual)
|
|
(primitive_type)
|
|
(function_declarator
|
|
(field_identifier)
|
|
(parameter_list)))
|
|
(field_declaration
|
|
(storage_class_specifier)
|
|
(virtual)
|
|
(primitive_type)
|
|
(function_declarator
|
|
(field_identifier)
|
|
(parameter_list)
|
|
(virtual_specifier)))
|
|
(field_declaration
|
|
(virtual)
|
|
(storage_class_specifier)
|
|
(primitive_type)
|
|
(function_declarator
|
|
(field_identifier)
|
|
(parameter_list)
|
|
(virtual_specifier))))))
|
|
|
|
================================================================================
|
|
Constructor and destructor declarations
|
|
================================================================================
|
|
|
|
class C {
|
|
void *data_;
|
|
|
|
public:
|
|
C();
|
|
C(int, float);
|
|
inline C();
|
|
explicit inline C();
|
|
[[deprecated]] C();
|
|
template <typename T>
|
|
C(T t);
|
|
C() : NS::Base<C>() {}
|
|
~C();
|
|
};
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(class_specifier
|
|
(type_identifier)
|
|
(field_declaration_list
|
|
(field_declaration
|
|
(primitive_type)
|
|
(pointer_declarator
|
|
(field_identifier)))
|
|
(access_specifier)
|
|
(declaration
|
|
(function_declarator
|
|
(identifier)
|
|
(parameter_list)))
|
|
(declaration
|
|
(function_declarator
|
|
(identifier)
|
|
(parameter_list
|
|
(parameter_declaration
|
|
(primitive_type))
|
|
(parameter_declaration
|
|
(primitive_type)))))
|
|
(declaration
|
|
(storage_class_specifier)
|
|
(function_declarator
|
|
(identifier)
|
|
(parameter_list)))
|
|
(declaration
|
|
(explicit_function_specifier)
|
|
(storage_class_specifier)
|
|
(function_declarator
|
|
(identifier)
|
|
(parameter_list)))
|
|
(declaration
|
|
(attribute_declaration
|
|
(attribute
|
|
(identifier)))
|
|
(function_declarator
|
|
(identifier)
|
|
(parameter_list)))
|
|
(template_declaration
|
|
(template_parameter_list
|
|
(type_parameter_declaration
|
|
(type_identifier)))
|
|
(declaration
|
|
(function_declarator
|
|
(identifier)
|
|
(parameter_list
|
|
(parameter_declaration
|
|
(type_identifier)
|
|
(identifier))))))
|
|
(function_definition
|
|
(function_declarator
|
|
(identifier)
|
|
(parameter_list))
|
|
(field_initializer_list
|
|
(field_initializer
|
|
(qualified_identifier
|
|
(namespace_identifier)
|
|
(template_method
|
|
(field_identifier)
|
|
(template_argument_list
|
|
(type_descriptor
|
|
(type_identifier)))))
|
|
(argument_list)))
|
|
(compound_statement))
|
|
(declaration
|
|
(function_declarator
|
|
(destructor_name
|
|
(identifier))
|
|
(parameter_list))))))
|
|
|
|
================================================================================
|
|
Classes with inheritance
|
|
================================================================================
|
|
|
|
class A : public B {};
|
|
class C : C::D, public E {};
|
|
class F : [[deprecated]] public G {};
|
|
class H : public virtual I {};
|
|
class J : virtual protected I {};
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(class_specifier
|
|
(type_identifier)
|
|
(base_class_clause
|
|
(access_specifier)
|
|
(type_identifier))
|
|
(field_declaration_list))
|
|
(class_specifier
|
|
(type_identifier)
|
|
(base_class_clause
|
|
(qualified_identifier
|
|
(namespace_identifier)
|
|
(type_identifier))
|
|
(access_specifier)
|
|
(type_identifier))
|
|
(field_declaration_list))
|
|
(class_specifier
|
|
(type_identifier)
|
|
(base_class_clause
|
|
(attribute_declaration
|
|
(attribute
|
|
(identifier)))
|
|
(access_specifier)
|
|
(type_identifier))
|
|
(field_declaration_list))
|
|
(class_specifier
|
|
(type_identifier)
|
|
(base_class_clause
|
|
(access_specifier)
|
|
(virtual)
|
|
(type_identifier))
|
|
(field_declaration_list))
|
|
(class_specifier
|
|
(type_identifier)
|
|
(base_class_clause
|
|
(virtual)
|
|
(access_specifier)
|
|
(type_identifier))
|
|
(field_declaration_list)))
|
|
|
|
================================================================================
|
|
Classes with final virt specifier
|
|
================================================================================
|
|
|
|
class A final : public B {
|
|
};
|
|
|
|
class C final {};
|
|
|
|
struct D final {};
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(class_specifier
|
|
(type_identifier)
|
|
(virtual_specifier)
|
|
(base_class_clause
|
|
(access_specifier)
|
|
(type_identifier))
|
|
(field_declaration_list))
|
|
(class_specifier
|
|
(type_identifier)
|
|
(virtual_specifier)
|
|
(field_declaration_list))
|
|
(struct_specifier
|
|
(type_identifier)
|
|
(virtual_specifier)
|
|
(field_declaration_list)))
|
|
|
|
================================================================================
|
|
Nested classes
|
|
================================================================================
|
|
|
|
class A {
|
|
private:
|
|
class B : private C, public D {
|
|
};
|
|
|
|
B e, f;
|
|
};
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(class_specifier
|
|
(type_identifier)
|
|
(field_declaration_list
|
|
(access_specifier)
|
|
(field_declaration
|
|
(class_specifier
|
|
(type_identifier)
|
|
(base_class_clause
|
|
(access_specifier)
|
|
(type_identifier)
|
|
(access_specifier)
|
|
(type_identifier))
|
|
(field_declaration_list)))
|
|
(field_declaration
|
|
(type_identifier)
|
|
(field_identifier)
|
|
(field_identifier)))))
|
|
|
|
================================================================================
|
|
Friend declarations
|
|
================================================================================
|
|
|
|
struct C {
|
|
friend class D;
|
|
friend D;
|
|
friend int f(C &);
|
|
|
|
template <typename T>
|
|
friend int g();
|
|
};
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(struct_specifier
|
|
(type_identifier)
|
|
(field_declaration_list
|
|
(friend_declaration
|
|
(type_identifier))
|
|
(friend_declaration
|
|
(type_identifier))
|
|
(friend_declaration
|
|
(declaration
|
|
(primitive_type)
|
|
(function_declarator
|
|
(identifier)
|
|
(parameter_list
|
|
(parameter_declaration
|
|
(type_identifier)
|
|
(abstract_reference_declarator))))))
|
|
(template_declaration
|
|
(template_parameter_list
|
|
(type_parameter_declaration
|
|
(type_identifier)))
|
|
(friend_declaration
|
|
(declaration
|
|
(primitive_type)
|
|
(function_declarator
|
|
(identifier)
|
|
(parameter_list))))))))
|
|
|
|
================================================================================
|
|
Default member initializers
|
|
================================================================================
|
|
|
|
struct A {
|
|
bool a = 1;
|
|
vector<int> b = {c, d, e};
|
|
F g {h};
|
|
};
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(struct_specifier
|
|
(type_identifier)
|
|
(field_declaration_list
|
|
(field_declaration
|
|
(primitive_type)
|
|
(field_identifier)
|
|
(number_literal))
|
|
(field_declaration
|
|
(template_type
|
|
(type_identifier)
|
|
(template_argument_list
|
|
(type_descriptor
|
|
(primitive_type))))
|
|
(field_identifier)
|
|
(initializer_list
|
|
(identifier)
|
|
(identifier)
|
|
(identifier)))
|
|
(field_declaration
|
|
(type_identifier)
|
|
(field_identifier)
|
|
(initializer_list
|
|
(identifier))))))
|
|
|
|
================================================================================
|
|
Function parameters with default values
|
|
================================================================================
|
|
|
|
int foo(bool x = 5) {}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(function_definition
|
|
(primitive_type)
|
|
(function_declarator
|
|
(identifier)
|
|
(parameter_list
|
|
(optional_parameter_declaration
|
|
(primitive_type)
|
|
(identifier)
|
|
(number_literal))))
|
|
(compound_statement)))
|
|
|
|
================================================================================
|
|
Attributes
|
|
================================================================================
|
|
|
|
int f([[a::b(c), d]] int x) {}
|
|
|
|
[[gnu::always_inline]] [[gnu::hot]] [[gnu::const]] [[nodiscard]]
|
|
inline int g();
|
|
|
|
[[aaa]]
|
|
int f() { }
|
|
|
|
class [[gnu::visibility("default")]] A {};
|
|
struct [[gnu::visibility("default")]] A {};
|
|
union [[gnu::visibility("default")]] A {};
|
|
|
|
class [[gnu::visibility("default")]] [[deprecated]] A {};
|
|
class A final : [[deprecated]] public B {};
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(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)))
|
|
(storage_class_specifier)
|
|
(primitive_type)
|
|
(function_declarator
|
|
(identifier)
|
|
(parameter_list)))
|
|
(function_definition
|
|
(attribute_declaration
|
|
(attribute
|
|
(identifier)))
|
|
(primitive_type)
|
|
(function_declarator
|
|
(identifier)
|
|
(parameter_list))
|
|
(compound_statement))
|
|
(class_specifier
|
|
(attribute_declaration
|
|
(attribute
|
|
(identifier)
|
|
(identifier)
|
|
(argument_list
|
|
(string_literal
|
|
(string_content)))))
|
|
(type_identifier)
|
|
(field_declaration_list))
|
|
(struct_specifier
|
|
(attribute_declaration
|
|
(attribute
|
|
(identifier)
|
|
(identifier)
|
|
(argument_list
|
|
(string_literal
|
|
(string_content)))))
|
|
(type_identifier)
|
|
(field_declaration_list))
|
|
(union_specifier
|
|
(attribute_declaration
|
|
(attribute
|
|
(identifier)
|
|
(identifier)
|
|
(argument_list
|
|
(string_literal
|
|
(string_content)))))
|
|
(type_identifier)
|
|
(field_declaration_list))
|
|
(class_specifier
|
|
(attribute_declaration
|
|
(attribute
|
|
(identifier)
|
|
(identifier)
|
|
(argument_list
|
|
(string_literal
|
|
(string_content)))))
|
|
(attribute_declaration
|
|
(attribute
|
|
(identifier)))
|
|
(type_identifier)
|
|
(field_declaration_list))
|
|
(class_specifier
|
|
(type_identifier)
|
|
(virtual_specifier)
|
|
(base_class_clause
|
|
(attribute_declaration
|
|
(attribute
|
|
(identifier)))
|
|
(access_specifier)
|
|
(type_identifier))
|
|
(field_declaration_list)))
|
|
|
|
================================================================================
|
|
Operator overload declarations
|
|
================================================================================
|
|
|
|
ostream &operator<<(ostream &, const A &a);
|
|
Foo operator "" _foo(const char* s);
|
|
std::string_view operator ""s_v(const char* s);
|
|
bool A::operator!=(const A &other) const;
|
|
|
|
bool A::operator ==(const A &other) const;
|
|
|
|
void * A::operator new(size_t s);
|
|
|
|
void * A::operator delete [](void * p);
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(declaration
|
|
(type_identifier)
|
|
(reference_declarator
|
|
(function_declarator
|
|
(operator_name)
|
|
(parameter_list
|
|
(parameter_declaration
|
|
(type_identifier)
|
|
(abstract_reference_declarator))
|
|
(parameter_declaration
|
|
(type_qualifier)
|
|
(type_identifier)
|
|
(reference_declarator
|
|
(identifier)))))))
|
|
(declaration
|
|
(type_identifier)
|
|
(function_declarator
|
|
(operator_name
|
|
(identifier))
|
|
(parameter_list
|
|
(parameter_declaration
|
|
(type_qualifier)
|
|
(primitive_type)
|
|
(pointer_declarator
|
|
(identifier))))))
|
|
(declaration
|
|
(qualified_identifier
|
|
(namespace_identifier)
|
|
(type_identifier))
|
|
(function_declarator
|
|
(operator_name
|
|
(identifier))
|
|
(parameter_list
|
|
(parameter_declaration
|
|
(type_qualifier)
|
|
(primitive_type)
|
|
(pointer_declarator
|
|
(identifier))))))
|
|
(declaration
|
|
(primitive_type)
|
|
(function_declarator
|
|
(qualified_identifier
|
|
(namespace_identifier)
|
|
(operator_name))
|
|
(parameter_list
|
|
(parameter_declaration
|
|
(type_qualifier)
|
|
(type_identifier)
|
|
(reference_declarator
|
|
(identifier))))
|
|
(type_qualifier)))
|
|
(declaration
|
|
(primitive_type)
|
|
(function_declarator
|
|
(qualified_identifier
|
|
(namespace_identifier)
|
|
(operator_name))
|
|
(parameter_list
|
|
(parameter_declaration
|
|
(type_qualifier)
|
|
(type_identifier)
|
|
(reference_declarator
|
|
(identifier))))
|
|
(type_qualifier)))
|
|
(declaration
|
|
(primitive_type)
|
|
(pointer_declarator
|
|
(function_declarator
|
|
(qualified_identifier
|
|
(namespace_identifier)
|
|
(operator_name))
|
|
(parameter_list
|
|
(parameter_declaration
|
|
(primitive_type)
|
|
(identifier))))))
|
|
(declaration
|
|
(primitive_type)
|
|
(pointer_declarator
|
|
(function_declarator
|
|
(qualified_identifier
|
|
(namespace_identifier)
|
|
(operator_name))
|
|
(parameter_list
|
|
(parameter_declaration
|
|
(primitive_type)
|
|
(pointer_declarator
|
|
(identifier))))))))
|
|
|
|
================================================================================
|
|
Template declarations
|
|
================================================================================
|
|
|
|
template <typename T>
|
|
void foo(T &t);
|
|
|
|
template <typename T, int u>
|
|
int bar(T &t) { return u; }
|
|
|
|
template <typename T>
|
|
class Foo {};
|
|
|
|
template <typename T>
|
|
Foo<T>::Foo(int mem) : mem_(mem) {}
|
|
|
|
template <typename T>
|
|
template <typename U>
|
|
void A<T>::foo(U&) {}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(template_declaration
|
|
(template_parameter_list
|
|
(type_parameter_declaration
|
|
(type_identifier)))
|
|
(declaration
|
|
(primitive_type)
|
|
(function_declarator
|
|
(identifier)
|
|
(parameter_list
|
|
(parameter_declaration
|
|
(type_identifier)
|
|
(reference_declarator
|
|
(identifier)))))))
|
|
(template_declaration
|
|
(template_parameter_list
|
|
(type_parameter_declaration
|
|
(type_identifier))
|
|
(parameter_declaration
|
|
(primitive_type)
|
|
(identifier)))
|
|
(function_definition
|
|
(primitive_type)
|
|
(function_declarator
|
|
(identifier)
|
|
(parameter_list
|
|
(parameter_declaration
|
|
(type_identifier)
|
|
(reference_declarator
|
|
(identifier)))))
|
|
(compound_statement
|
|
(return_statement
|
|
(identifier)))))
|
|
(template_declaration
|
|
(template_parameter_list
|
|
(type_parameter_declaration
|
|
(type_identifier)))
|
|
(class_specifier
|
|
(type_identifier)
|
|
(field_declaration_list)))
|
|
(template_declaration
|
|
(template_parameter_list
|
|
(type_parameter_declaration
|
|
(type_identifier)))
|
|
(function_definition
|
|
(function_declarator
|
|
(qualified_identifier
|
|
(template_type
|
|
(type_identifier)
|
|
(template_argument_list
|
|
(type_descriptor
|
|
(type_identifier))))
|
|
(identifier))
|
|
(parameter_list
|
|
(parameter_declaration
|
|
(primitive_type)
|
|
(identifier))))
|
|
(field_initializer_list
|
|
(field_initializer
|
|
(field_identifier)
|
|
(argument_list
|
|
(identifier))))
|
|
(compound_statement)))
|
|
(template_declaration
|
|
(template_parameter_list
|
|
(type_parameter_declaration
|
|
(type_identifier)))
|
|
(template_declaration
|
|
(template_parameter_list
|
|
(type_parameter_declaration
|
|
(type_identifier)))
|
|
(function_definition
|
|
(primitive_type)
|
|
(function_declarator
|
|
(qualified_identifier
|
|
(template_type
|
|
(type_identifier)
|
|
(template_argument_list
|
|
(type_descriptor
|
|
(type_identifier))))
|
|
(identifier))
|
|
(parameter_list
|
|
(parameter_declaration
|
|
(type_identifier)
|
|
(abstract_reference_declarator))))
|
|
(compound_statement)))))
|
|
|
|
================================================================================
|
|
Template template declarations
|
|
================================================================================
|
|
|
|
template <template <typename> typename T>
|
|
void foo() {}
|
|
|
|
template <template <typename...> class>
|
|
void bar() {}
|
|
|
|
template <template <typename> typename...>
|
|
void baz() {}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(template_declaration
|
|
(template_parameter_list
|
|
(template_template_parameter_declaration
|
|
(template_parameter_list
|
|
(type_parameter_declaration))
|
|
(type_parameter_declaration
|
|
(type_identifier))))
|
|
(function_definition
|
|
(primitive_type)
|
|
(function_declarator
|
|
(identifier)
|
|
(parameter_list))
|
|
(compound_statement)))
|
|
(template_declaration
|
|
(template_parameter_list
|
|
(template_template_parameter_declaration
|
|
(template_parameter_list
|
|
(variadic_type_parameter_declaration))
|
|
(type_parameter_declaration)))
|
|
(function_definition
|
|
(primitive_type)
|
|
(function_declarator
|
|
(identifier)
|
|
(parameter_list))
|
|
(compound_statement)))
|
|
(template_declaration
|
|
(template_parameter_list
|
|
(template_template_parameter_declaration
|
|
(template_parameter_list
|
|
(type_parameter_declaration))
|
|
(variadic_type_parameter_declaration)))
|
|
(function_definition
|
|
(primitive_type)
|
|
(function_declarator
|
|
(identifier)
|
|
(parameter_list))
|
|
(compound_statement))))
|
|
|
|
================================================================================
|
|
Template specializations
|
|
================================================================================
|
|
|
|
template <>
|
|
void foo<T>(T &t);
|
|
|
|
template <>
|
|
struct foo::bar<T> {};
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(template_declaration
|
|
(template_parameter_list)
|
|
(declaration
|
|
(primitive_type)
|
|
(function_declarator
|
|
(template_function
|
|
(identifier)
|
|
(template_argument_list
|
|
(type_descriptor
|
|
(type_identifier))))
|
|
(parameter_list
|
|
(parameter_declaration
|
|
(type_identifier)
|
|
(reference_declarator
|
|
(identifier)))))))
|
|
(template_declaration
|
|
(template_parameter_list)
|
|
(struct_specifier
|
|
(qualified_identifier
|
|
(namespace_identifier)
|
|
(template_type
|
|
(type_identifier)
|
|
(template_argument_list
|
|
(type_descriptor
|
|
(type_identifier)))))
|
|
(field_declaration_list))))
|
|
|
|
================================================================================
|
|
Template methods
|
|
================================================================================
|
|
|
|
class Person {
|
|
Person() {
|
|
this->speak<int>();
|
|
}
|
|
|
|
template <typename T>
|
|
void speak() {}
|
|
|
|
template <>
|
|
void speak<bool>() {}
|
|
};
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(class_specifier
|
|
(type_identifier)
|
|
(field_declaration_list
|
|
(function_definition
|
|
(function_declarator
|
|
(identifier)
|
|
(parameter_list))
|
|
(compound_statement
|
|
(expression_statement
|
|
(call_expression
|
|
(field_expression
|
|
(this)
|
|
(template_method
|
|
(field_identifier)
|
|
(template_argument_list
|
|
(type_descriptor
|
|
(primitive_type)))))
|
|
(argument_list)))))
|
|
(template_declaration
|
|
(template_parameter_list
|
|
(type_parameter_declaration
|
|
(type_identifier)))
|
|
(function_definition
|
|
(primitive_type)
|
|
(function_declarator
|
|
(identifier)
|
|
(parameter_list))
|
|
(compound_statement)))
|
|
(template_declaration
|
|
(template_parameter_list)
|
|
(function_definition
|
|
(primitive_type)
|
|
(function_declarator
|
|
(template_function
|
|
(identifier)
|
|
(template_argument_list
|
|
(type_descriptor
|
|
(primitive_type))))
|
|
(parameter_list))
|
|
(compound_statement))))))
|
|
|
|
================================================================================
|
|
Templates with optional type parameters
|
|
================================================================================
|
|
|
|
template <typename T = U::V<void>>
|
|
class X
|
|
{
|
|
};
|
|
|
|
template <typename = void>
|
|
class Y
|
|
{
|
|
};
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(template_declaration
|
|
parameters: (template_parameter_list
|
|
(optional_type_parameter_declaration
|
|
name: (type_identifier)
|
|
default_type: (qualified_identifier
|
|
scope: (namespace_identifier)
|
|
name: (template_type
|
|
name: (type_identifier)
|
|
arguments: (template_argument_list
|
|
(type_descriptor
|
|
type: (primitive_type)))))))
|
|
(class_specifier
|
|
name: (type_identifier)
|
|
body: (field_declaration_list)))
|
|
(template_declaration
|
|
parameters: (template_parameter_list
|
|
(optional_type_parameter_declaration
|
|
default_type: (primitive_type)))
|
|
(class_specifier
|
|
name: (type_identifier)
|
|
body: (field_declaration_list))))
|
|
|
|
================================================================================
|
|
Templates with optional anonymous parameters
|
|
================================================================================
|
|
|
|
template <class T, typename a::b<!c<T>{} && (d<T>{} || e<T>{})>::type = 0>
|
|
class X
|
|
{
|
|
};
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(template_declaration
|
|
parameters: (template_parameter_list
|
|
(type_parameter_declaration
|
|
(type_identifier))
|
|
(optional_parameter_declaration
|
|
type: (dependent_type
|
|
(qualified_identifier
|
|
scope: (namespace_identifier)
|
|
name: (qualified_identifier
|
|
scope: (template_type
|
|
name: (type_identifier)
|
|
arguments: (template_argument_list
|
|
(binary_expression
|
|
left: (unary_expression
|
|
argument: (compound_literal_expression
|
|
type: (template_type
|
|
name: (type_identifier)
|
|
arguments: (template_argument_list
|
|
(type_descriptor
|
|
type: (type_identifier))))
|
|
value: (initializer_list)))
|
|
right: (parenthesized_expression
|
|
(binary_expression
|
|
left: (compound_literal_expression
|
|
type: (template_type
|
|
name: (type_identifier)
|
|
arguments: (template_argument_list
|
|
(type_descriptor
|
|
type: (type_identifier))))
|
|
value: (initializer_list))
|
|
right: (compound_literal_expression
|
|
type: (template_type
|
|
name: (type_identifier)
|
|
arguments: (template_argument_list
|
|
(type_descriptor
|
|
type: (type_identifier))))
|
|
value: (initializer_list)))))))
|
|
name: (type_identifier))))
|
|
default_value: (number_literal)))
|
|
(class_specifier
|
|
name: (type_identifier)
|
|
body: (field_declaration_list))))
|
|
|
|
================================================================================
|
|
Declarations with braced initializer lists
|
|
================================================================================
|
|
|
|
A foo{1, 2};
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(declaration
|
|
(type_identifier)
|
|
(init_declarator
|
|
(identifier)
|
|
(initializer_list
|
|
(number_literal)
|
|
(number_literal)))))
|
|
|
|
================================================================================
|
|
Empty function bodies
|
|
================================================================================
|
|
|
|
int main() {}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(function_definition
|
|
(primitive_type)
|
|
(function_declarator
|
|
(identifier)
|
|
(parameter_list))
|
|
(compound_statement)))
|
|
|
|
================================================================================
|
|
Explicit template instantiations
|
|
================================================================================
|
|
|
|
template A<int, bool>::A(char *, size_t);
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(template_instantiation
|
|
(function_declarator
|
|
(qualified_identifier
|
|
(template_type
|
|
(type_identifier)
|
|
(template_argument_list
|
|
(type_descriptor
|
|
(primitive_type))
|
|
(type_descriptor
|
|
(primitive_type))))
|
|
(identifier))
|
|
(parameter_list
|
|
(parameter_declaration
|
|
(primitive_type)
|
|
(abstract_pointer_declarator))
|
|
(parameter_declaration
|
|
(primitive_type))))))
|
|
|
|
================================================================================
|
|
Structured binding declarations
|
|
================================================================================
|
|
|
|
auto [a] = B{};
|
|
|
|
int main() {
|
|
auto &&[b, c] = std::make_tuple(c);
|
|
const auto [x, y] {1, 2};
|
|
|
|
for (const auto &[a, b] : c) {}
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(declaration
|
|
type: (placeholder_type_specifier
|
|
(auto))
|
|
declarator: (init_declarator
|
|
declarator: (structured_binding_declarator
|
|
(identifier))
|
|
value: (compound_literal_expression
|
|
type: (type_identifier)
|
|
value: (initializer_list))))
|
|
(function_definition
|
|
type: (primitive_type)
|
|
declarator: (function_declarator
|
|
declarator: (identifier)
|
|
parameters: (parameter_list))
|
|
body: (compound_statement
|
|
(declaration
|
|
type: (placeholder_type_specifier
|
|
(auto))
|
|
declarator: (init_declarator
|
|
declarator: (reference_declarator
|
|
(structured_binding_declarator
|
|
(identifier)
|
|
(identifier)))
|
|
value: (call_expression
|
|
function: (qualified_identifier
|
|
scope: (namespace_identifier)
|
|
name: (identifier))
|
|
arguments: (argument_list
|
|
(identifier)))))
|
|
(declaration
|
|
(type_qualifier)
|
|
type: (placeholder_type_specifier
|
|
(auto))
|
|
declarator: (init_declarator
|
|
declarator: (structured_binding_declarator
|
|
(identifier)
|
|
(identifier))
|
|
value: (initializer_list
|
|
(number_literal)
|
|
(number_literal))))
|
|
(for_range_loop
|
|
(type_qualifier)
|
|
type: (placeholder_type_specifier
|
|
(auto))
|
|
declarator: (reference_declarator
|
|
(structured_binding_declarator
|
|
(identifier)
|
|
(identifier)))
|
|
right: (identifier)
|
|
body: (compound_statement)))))
|
|
|
|
================================================================================
|
|
Constexpr/constinit/consteval declarations
|
|
================================================================================
|
|
|
|
constexpr double pi = 3.14159;
|
|
consteval int answer();
|
|
constinit int life = answer();
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(declaration
|
|
(type_qualifier)
|
|
(primitive_type)
|
|
(init_declarator
|
|
(identifier)
|
|
(number_literal)))
|
|
(declaration
|
|
(type_qualifier)
|
|
(primitive_type)
|
|
(function_declarator
|
|
(identifier)
|
|
(parameter_list)))
|
|
(declaration
|
|
(type_qualifier)
|
|
(primitive_type)
|
|
(init_declarator
|
|
(identifier)
|
|
(call_expression
|
|
(identifier)
|
|
(argument_list)))))
|
|
|
|
================================================================================
|
|
Variadic templates
|
|
================================================================================
|
|
|
|
template <class T>
|
|
class TT {
|
|
template <typename... Ts>
|
|
void func1(Ts ... args) {
|
|
func3(nullptr);
|
|
}
|
|
|
|
void func2(Ts &&... args) {}
|
|
|
|
template <typename...>
|
|
void func3() {}
|
|
|
|
template <std::size_t...>
|
|
void func4() {}
|
|
};
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(template_declaration
|
|
(template_parameter_list
|
|
(type_parameter_declaration
|
|
(type_identifier)))
|
|
(class_specifier
|
|
(type_identifier)
|
|
(field_declaration_list
|
|
(template_declaration
|
|
(template_parameter_list
|
|
(variadic_type_parameter_declaration
|
|
(type_identifier)))
|
|
(function_definition
|
|
(primitive_type)
|
|
(function_declarator
|
|
(identifier)
|
|
(parameter_list
|
|
(variadic_parameter_declaration
|
|
(type_identifier)
|
|
(variadic_declarator
|
|
(identifier)))))
|
|
(compound_statement
|
|
(expression_statement
|
|
(call_expression
|
|
(identifier)
|
|
(argument_list
|
|
(null)))))))
|
|
(function_definition
|
|
(primitive_type)
|
|
(function_declarator
|
|
(field_identifier)
|
|
(parameter_list
|
|
(variadic_parameter_declaration
|
|
(type_identifier)
|
|
(reference_declarator
|
|
(variadic_declarator
|
|
(identifier))))))
|
|
(compound_statement))
|
|
(template_declaration
|
|
(template_parameter_list
|
|
(variadic_type_parameter_declaration))
|
|
(function_definition
|
|
(primitive_type)
|
|
(function_declarator
|
|
(identifier)
|
|
(parameter_list))
|
|
(compound_statement)))
|
|
(template_declaration
|
|
(template_parameter_list
|
|
(variadic_parameter_declaration
|
|
(qualified_identifier
|
|
(namespace_identifier)
|
|
(type_identifier))
|
|
(variadic_declarator)))
|
|
(function_definition
|
|
(primitive_type)
|
|
(function_declarator
|
|
(identifier)
|
|
(parameter_list))
|
|
(compound_statement)))))))
|
|
|
|
================================================================================
|
|
Enums
|
|
================================================================================
|
|
|
|
enum Foo : char { };
|
|
enum Foo : Bar { };
|
|
enum Foo : unsigned int { };
|
|
enum {a, b};
|
|
enum Foo : Bar::Rab { };
|
|
enum Foo::Oof : Bar::Rab { };
|
|
enum class Foo;
|
|
enum struct Foo : char { };
|
|
|
|
class Foo {
|
|
enum Bar {
|
|
A, B
|
|
};
|
|
};
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(enum_specifier
|
|
(type_identifier)
|
|
(type_identifier)
|
|
(enumerator_list))
|
|
(enum_specifier
|
|
(type_identifier)
|
|
(type_identifier)
|
|
(enumerator_list))
|
|
(enum_specifier
|
|
(type_identifier)
|
|
(sized_type_specifier
|
|
(primitive_type))
|
|
(enumerator_list))
|
|
(enum_specifier
|
|
(enumerator_list
|
|
(enumerator
|
|
(identifier))
|
|
(enumerator
|
|
(identifier))))
|
|
(enum_specifier
|
|
(type_identifier)
|
|
(qualified_identifier
|
|
(namespace_identifier)
|
|
(type_identifier))
|
|
(enumerator_list))
|
|
(enum_specifier
|
|
(qualified_identifier
|
|
(namespace_identifier)
|
|
(type_identifier))
|
|
(qualified_identifier
|
|
(namespace_identifier)
|
|
(type_identifier))
|
|
(enumerator_list))
|
|
(enum_specifier
|
|
(type_identifier))
|
|
(enum_specifier
|
|
(type_identifier)
|
|
(type_identifier)
|
|
(enumerator_list))
|
|
(class_specifier
|
|
(type_identifier)
|
|
(field_declaration_list
|
|
(field_declaration
|
|
(enum_specifier
|
|
(type_identifier)
|
|
(enumerator_list
|
|
(enumerator
|
|
(identifier))
|
|
(enumerator
|
|
(identifier))))))))
|
|
|
|
================================================================================
|
|
static_assert declarations
|
|
================================================================================
|
|
|
|
class A { static_assert(true, "message"); };
|
|
void f() { static_assert(false); }
|
|
static_assert(std::is_constructible<A>::value);
|
|
static_assert(true, "string1" "string2");
|
|
static_assert(true, R"FOO(string)FOO");
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(class_specifier
|
|
name: (type_identifier)
|
|
body: (field_declaration_list
|
|
(static_assert_declaration
|
|
condition: (true)
|
|
message: (string_literal
|
|
(string_content)))))
|
|
(function_definition
|
|
type: (primitive_type)
|
|
declarator: (function_declarator
|
|
declarator: (identifier)
|
|
parameters: (parameter_list))
|
|
body: (compound_statement
|
|
(static_assert_declaration
|
|
condition: (false))))
|
|
(static_assert_declaration
|
|
condition: (qualified_identifier
|
|
scope: (namespace_identifier)
|
|
name: (qualified_identifier
|
|
scope: (template_type
|
|
name: (type_identifier)
|
|
arguments: (template_argument_list
|
|
(type_descriptor
|
|
type: (type_identifier))))
|
|
name: (identifier))))
|
|
(static_assert_declaration
|
|
condition: (true)
|
|
message: (concatenated_string
|
|
(string_literal
|
|
(string_content))
|
|
(string_literal
|
|
(string_content))))
|
|
(static_assert_declaration
|
|
condition: (true)
|
|
message: (raw_string_literal
|
|
delimiter: (raw_string_delimiter)
|
|
(raw_string_content)
|
|
(raw_string_delimiter))))
|
|
|
|
================================================================================
|
|
Cast operator overload declarations
|
|
================================================================================
|
|
|
|
operator int() const;
|
|
explicit operator int*() const;
|
|
operator arr_t*();
|
|
operator B&();
|
|
operator auto() const;
|
|
virtual operator A() = 0;
|
|
A::B::operator C();
|
|
template <typename T>
|
|
operator T*();
|
|
[[nodiscard]] operator char *();
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(declaration
|
|
(operator_cast
|
|
(primitive_type)
|
|
(abstract_function_declarator
|
|
(parameter_list)
|
|
(type_qualifier))))
|
|
(declaration
|
|
(explicit_function_specifier)
|
|
(operator_cast
|
|
(primitive_type)
|
|
(abstract_pointer_declarator
|
|
(abstract_function_declarator
|
|
(parameter_list)
|
|
(type_qualifier)))))
|
|
(declaration
|
|
(operator_cast
|
|
(type_identifier)
|
|
(abstract_pointer_declarator
|
|
(abstract_function_declarator
|
|
(parameter_list)))))
|
|
(declaration
|
|
(operator_cast
|
|
(type_identifier)
|
|
(abstract_reference_declarator
|
|
(abstract_function_declarator
|
|
(parameter_list)))))
|
|
(declaration
|
|
(operator_cast
|
|
(placeholder_type_specifier
|
|
(auto))
|
|
(abstract_function_declarator
|
|
(parameter_list)
|
|
(type_qualifier))))
|
|
(declaration
|
|
(virtual)
|
|
(operator_cast
|
|
(type_identifier)
|
|
(abstract_function_declarator
|
|
(parameter_list)))
|
|
(number_literal))
|
|
(declaration
|
|
(qualified_identifier
|
|
(namespace_identifier)
|
|
(qualified_identifier
|
|
(namespace_identifier)
|
|
(operator_cast
|
|
(type_identifier)
|
|
(abstract_function_declarator
|
|
(parameter_list))))))
|
|
(template_declaration
|
|
(template_parameter_list
|
|
(type_parameter_declaration
|
|
(type_identifier)))
|
|
(declaration
|
|
(operator_cast
|
|
(type_identifier)
|
|
(abstract_pointer_declarator
|
|
(abstract_function_declarator
|
|
(parameter_list))))))
|
|
(declaration
|
|
(attribute_declaration
|
|
(attribute
|
|
(identifier)))
|
|
(operator_cast
|
|
(primitive_type)
|
|
(abstract_pointer_declarator
|
|
(abstract_function_declarator
|
|
(parameter_list))))))
|
|
|
|
================================================================================
|
|
Class scope cast operator overload declarations
|
|
================================================================================
|
|
|
|
class A {
|
|
operator int() const {}
|
|
explicit operator int*() const;
|
|
operator arr_t*();
|
|
operator B&();
|
|
operator auto() const;
|
|
virtual operator A() = 0;
|
|
A::B::operator C();
|
|
template <typename T>
|
|
operator T*();
|
|
[[nodiscard]] operator char *();
|
|
};
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(class_specifier
|
|
(type_identifier)
|
|
(field_declaration_list
|
|
(function_definition
|
|
(operator_cast
|
|
(primitive_type)
|
|
(abstract_function_declarator
|
|
(parameter_list)
|
|
(type_qualifier)))
|
|
(compound_statement))
|
|
(declaration
|
|
(explicit_function_specifier)
|
|
(operator_cast
|
|
(primitive_type)
|
|
(abstract_pointer_declarator
|
|
(abstract_function_declarator
|
|
(parameter_list)
|
|
(type_qualifier)))))
|
|
(declaration
|
|
(operator_cast
|
|
(type_identifier)
|
|
(abstract_pointer_declarator
|
|
(abstract_function_declarator
|
|
(parameter_list)))))
|
|
(declaration
|
|
(operator_cast
|
|
(type_identifier)
|
|
(abstract_reference_declarator
|
|
(abstract_function_declarator
|
|
(parameter_list)))))
|
|
(declaration
|
|
(operator_cast
|
|
(placeholder_type_specifier
|
|
(auto))
|
|
(abstract_function_declarator
|
|
(parameter_list)
|
|
(type_qualifier))))
|
|
(declaration
|
|
(virtual)
|
|
(operator_cast
|
|
(type_identifier)
|
|
(abstract_function_declarator
|
|
(parameter_list)))
|
|
(number_literal))
|
|
(declaration
|
|
(qualified_identifier
|
|
(namespace_identifier)
|
|
(qualified_identifier
|
|
(namespace_identifier)
|
|
(operator_cast
|
|
(type_identifier)
|
|
(abstract_function_declarator
|
|
(parameter_list))))))
|
|
(template_declaration
|
|
(template_parameter_list
|
|
(type_parameter_declaration
|
|
(type_identifier)))
|
|
(declaration
|
|
(operator_cast
|
|
(type_identifier)
|
|
(abstract_pointer_declarator
|
|
(abstract_function_declarator
|
|
(parameter_list))))))
|
|
(declaration
|
|
(attribute_declaration
|
|
(attribute
|
|
(identifier)))
|
|
(operator_cast
|
|
(primitive_type)
|
|
(abstract_pointer_declarator
|
|
(abstract_function_declarator
|
|
(parameter_list))))))))
|
|
|
|
================================================================================
|
|
Function declarations
|
|
================================================================================
|
|
|
|
inline int g();
|
|
inline int h() { }
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(declaration
|
|
(storage_class_specifier)
|
|
type: (primitive_type)
|
|
declarator: (function_declarator
|
|
declarator: (identifier)
|
|
parameters: (parameter_list)))
|
|
(function_definition
|
|
(storage_class_specifier)
|
|
type: (primitive_type)
|
|
declarator: (function_declarator
|
|
declarator: (identifier)
|
|
parameters: (parameter_list))
|
|
body: (compound_statement)))
|
|
|
|
================================================================================
|
|
Variable storage classes
|
|
================================================================================
|
|
|
|
int a;
|
|
extern int b, c;
|
|
register int e;
|
|
static int f;
|
|
thread_local int c;
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(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)))
|
|
|
|
================================================================================
|
|
Ref-qualifiers
|
|
================================================================================
|
|
|
|
class C
|
|
{
|
|
void f() &;
|
|
void f() && noexcept;
|
|
void f() & {}
|
|
void f() & noexcept {}
|
|
};
|
|
|
|
void C::f() &;
|
|
void C::f() & noexcept;
|
|
void C::f() && {}
|
|
void C::f() & noexcept {}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(class_specifier
|
|
(type_identifier)
|
|
(field_declaration_list
|
|
(field_declaration
|
|
(primitive_type)
|
|
(function_declarator
|
|
(field_identifier)
|
|
(parameter_list)
|
|
(ref_qualifier)))
|
|
(field_declaration
|
|
(primitive_type)
|
|
(function_declarator
|
|
(field_identifier)
|
|
(parameter_list)
|
|
(ref_qualifier)
|
|
(noexcept)))
|
|
(function_definition
|
|
(primitive_type)
|
|
(function_declarator
|
|
(field_identifier)
|
|
(parameter_list)
|
|
(ref_qualifier))
|
|
(compound_statement))
|
|
(function_definition
|
|
(primitive_type)
|
|
(function_declarator
|
|
(field_identifier)
|
|
(parameter_list)
|
|
(ref_qualifier)
|
|
(noexcept))
|
|
(compound_statement))))
|
|
(declaration
|
|
(primitive_type)
|
|
(function_declarator
|
|
(qualified_identifier
|
|
(namespace_identifier)
|
|
(identifier))
|
|
(parameter_list)
|
|
(ref_qualifier)))
|
|
(declaration
|
|
(primitive_type)
|
|
(function_declarator
|
|
(qualified_identifier
|
|
(namespace_identifier)
|
|
(identifier))
|
|
(parameter_list)
|
|
(ref_qualifier)
|
|
(noexcept)))
|
|
(function_definition
|
|
(primitive_type)
|
|
(function_declarator
|
|
(qualified_identifier
|
|
(namespace_identifier)
|
|
(identifier))
|
|
(parameter_list)
|
|
(ref_qualifier))
|
|
(compound_statement))
|
|
(function_definition
|
|
(primitive_type)
|
|
(function_declarator
|
|
(qualified_identifier
|
|
(namespace_identifier)
|
|
(identifier))
|
|
(parameter_list)
|
|
(ref_qualifier)
|
|
(noexcept))
|
|
(compound_statement)))
|
|
|
|
================================================================================
|
|
Default comparison declarations
|
|
================================================================================
|
|
|
|
struct A {
|
|
auto operator<=>(A const &) = default;
|
|
friend auto operator<=>(A const &, A const &) = default;
|
|
};
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(translation_unit
|
|
(struct_specifier
|
|
(type_identifier)
|
|
(field_declaration_list
|
|
(function_definition
|
|
(placeholder_type_specifier
|
|
(auto))
|
|
(function_declarator
|
|
(operator_name)
|
|
(parameter_list
|
|
(parameter_declaration
|
|
(type_identifier)
|
|
(type_qualifier)
|
|
(abstract_reference_declarator))))
|
|
(default_method_clause))
|
|
(friend_declaration
|
|
(declaration
|
|
(placeholder_type_specifier
|
|
(auto))
|
|
(init_declarator
|
|
(function_declarator
|
|
(operator_name)
|
|
(parameter_list
|
|
(parameter_declaration
|
|
(type_identifier)
|
|
(type_qualifier)
|
|
(abstract_reference_declarator))
|
|
(parameter_declaration
|
|
(type_identifier)
|
|
(type_qualifier)
|
|
(abstract_reference_declarator))))
|
|
(identifier)))))))
|