=====================================
Scoped function definitions
=====================================

int T::foo() { return 1; }
int T::foo() const { return 0; }

---

(translation_unit
  (function_definition
    (primitive_type)
    (function_declarator
      (qualified_identifier (namespace_identifier) (identifier))
      (parameter_list))
    (compound_statement (return_statement (number_literal))))
  (function_definition
    (primitive_type)
    (function_declarator
      (qualified_identifier (namespace_identifier) (identifier))
      (parameter_list)
      (type_qualifier))
    (compound_statement (return_statement (number_literal)))))

=====================================
Constructor definitions
=====================================

T::T() {}

T::T() : f1(0), f2(1, 2) {
  puts("HI");
}

T::T() : Base<T>() {}

T::T() try : f1(0) {} catch(...) {}

---

(translation_unit
  (function_definition
    (function_declarator
      (qualified_identifier (namespace_identifier) (identifier))
      (parameter_list))
    (compound_statement))
  (function_definition
    (function_declarator
      (qualified_identifier (namespace_identifier) (identifier))
      (parameter_list))
    (field_initializer_list
      (field_initializer (field_identifier) (argument_list (number_literal)))
      (field_initializer (field_identifier) (argument_list (number_literal) (number_literal))))
    (compound_statement
      (expression_statement (call_expression (identifier) (argument_list (string_literal))))))
  (function_definition
    (function_declarator
      (qualified_identifier (namespace_identifier) (identifier))
      (parameter_list))
    (field_initializer_list
      (field_initializer
        (template_method
          (field_identifier)
          (template_argument_list (type_descriptor (type_identifier))))
        (argument_list)))
    (compound_statement))
  (function_definition
    (function_declarator
      (qualified_identifier
        (namespace_identifier)
        (identifier))
      (parameter_list))
    (try_statement
      (field_initializer_list
        (field_initializer
          (field_identifier)
          (argument_list
            (number_literal))))
      (compound_statement)
      (catch_clause
        (parameter_list)
        (compound_statement)))))

=====================================
Explicit constructor definitions
=====================================

class C {
  explicit C(int f) : f_(f) {}

 private:
  int f_;
};

---

(translation_unit
  (class_specifier
    (type_identifier)
    (field_declaration_list
      (function_definition
        (explicit_function_specifier)
        (function_declarator
          (identifier)
          (parameter_list (parameter_declaration (primitive_type) (identifier))))
        (field_initializer_list
          (field_initializer (field_identifier) (argument_list (identifier))))
        (compound_statement))
      (access_specifier)
        (field_declaration (primitive_type) (field_identifier)))))

=====================================
Explicit constructor declaration
=====================================

class C {
  explicit C(int f);
  explicit(true) C(long f);
};

---

(translation_unit
  (class_specifier
    (type_identifier)
    (field_declaration_list
      (declaration
        (explicit_function_specifier)
        (function_declarator (identifier) (parameter_list (parameter_declaration (primitive_type) (identifier)))))
      (declaration
        (explicit_function_specifier (true))
        (function_declarator (identifier) (parameter_list (parameter_declaration (sized_type_specifier) (identifier))))))))

=====================================
Default and deleted methods
=====================================

class A : public B {
  A() = default;
  A(A &&) = delete;
  void f() = delete;
  A& operator=(const A&) = default;
  A& operator=(A&&) = delete;
};

---

(translation_unit
  (class_specifier
    (type_identifier)
    (base_class_clause
      (access_specifier)
      (type_identifier))
    (field_declaration_list
      (function_definition
        (function_declarator (identifier) (parameter_list))
        (default_method_clause))
      (function_definition
        (function_declarator
          (identifier)
          (parameter_list (parameter_declaration (type_identifier) (abstract_reference_declarator))))
        (delete_method_clause))
      (function_definition
        (primitive_type)
        (function_declarator (field_identifier) (parameter_list)) (delete_method_clause))
      (function_definition
        (type_identifier)
        (reference_declarator
          (function_declarator
            (operator_name)
            (parameter_list (parameter_declaration (type_qualifier) (type_identifier) (abstract_reference_declarator)))))
        (default_method_clause))
      (function_definition
        (type_identifier)
        (reference_declarator
          (function_declarator
            (operator_name)
            (parameter_list (parameter_declaration (type_identifier) (abstract_reference_declarator)))))
        (delete_method_clause)))))

=====================================
Destructor definitions
=====================================

~T() {}
T::~T() {}

---

(translation_unit
  (function_definition
    (function_declarator (destructor_name (identifier)) (parameter_list))
    (compound_statement))
  (function_definition
    (function_declarator
      (qualified_identifier (namespace_identifier) (destructor_name (identifier))) (parameter_list))
    (compound_statement)))

=====================================
Function-try-block definitions
=====================================

void foo() try {} catch(...) {}

---

(translation_unit
  (function_definition
    (primitive_type)
    (function_declarator
      (identifier)
      (parameter_list))
    (try_statement
      (compound_statement)
      (catch_clause
        (parameter_list)
        (compound_statement)))))


=====================================
Conversion operator definitions
=====================================

T::operator int() try { throw 1; } catch (...) { return 2; }

---

(translation_unit
  (function_definition
    (qualified_identifier
      (namespace_identifier)
      (operator_cast
        (primitive_type)
        (abstract_function_declarator
          (parameter_list))))
    (try_statement
      (compound_statement
        (throw_statement
          (number_literal)))
      (catch_clause
        (parameter_list)
        (compound_statement
          (return_statement
            (number_literal)))))))

