================================================================================ 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; [[deprecated]] using namespace std; template using a = typename b::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)) (using_declaration (attribute_declaration (attribute (identifier))) (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(); } -------------------------------------------------------------------------------- (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 getF0(this S &self) { return self.f; } 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 (explicit_object_parameter_declaration (this) (parameter_declaration (type_identifier) (reference_declarator (identifier)))))) (compound_statement (return_statement (field_expression (identifier) (field_identifier))))) (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 (function_declarator (destructor_name (identifier)) (parameter_list))) (field_declaration (primitive_type) (function_declarator (field_identifier) (parameter_list))) (function_definition (primitive_type) (function_declarator (field_identifier) (parameter_list)) (compound_statement)) (field_declaration (primitive_type) (function_declarator (field_identifier) (parameter_list))) (field_declaration (storage_class_specifier) (primitive_type) (function_declarator (field_identifier) (parameter_list) (virtual_specifier))) (field_declaration (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 C(T t); C() : NS::Base() {} ~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 {}; class K : virtual I {}; class L : 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) (type_identifier)) (field_declaration_list)) (class_specifier (type_identifier) (base_class_clause (access_specifier) (type_identifier)) (field_declaration_list)) (class_specifier (type_identifier) (base_class_clause (type_identifier)) (field_declaration_list)) (class_specifier (type_identifier) (base_class_clause (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 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 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(); [[using gnu: always_inline, hot, const, visibility("default")]] [[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))) (declaration (attribute_declaration (attribute (identifier) (identifier)) (attribute (identifier)) (attribute (identifier)) (attribute (identifier) (argument_list (string_literal (string_content))))) (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 void foo(T &t); template int bar(T &t) { return u; } template class Foo {}; template Foo::Foo(int mem) : mem_(mem) {} template template void A::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