==========================================
The auto type
==========================================

void foo() {
  auto x = 1;
}

---

(translation_unit
  (function_definition
    (primitive_type)
    (function_declarator (identifier) (parameter_list))
    (compound_statement
      (declaration (auto) (init_declarator (identifier) (number_literal))))))

==========================================
Namespaced types
==========================================

std::string my_string;
std::vector<int>::size_typ my_string;

---

(translation_unit
  (declaration
    (scoped_type_identifier (namespace_identifier) (type_identifier))
    (identifier))
  (declaration
    (scoped_type_identifier
      (template_type
        (scoped_type_identifier (namespace_identifier) (type_identifier))
        (template_argument_list (type_descriptor (primitive_type))))
      (type_identifier))
    (identifier)))

==========================================
Dependent type names
==========================================

template<typename T>
struct X : B<T>
{
    typename T::A* pa;
};

---

(translation_unit
  (template_declaration
    (template_parameter_list (type_parameter_declaration (type_identifier)))
    (struct_specifier
      (type_identifier)
      (base_class_clause
        (template_type (type_identifier) (template_argument_list (type_descriptor (type_identifier)))))
      (field_declaration_list
        (field_declaration
          (dependent_type (scoped_type_identifier (namespace_identifier) (type_identifier)))
          (pointer_declarator (field_identifier)))))))

==========================================
Template types with empty argument lists
==========================================

use_future_t<> use_future;

---

(translation_unit
  (declaration (template_type (type_identifier) (template_argument_list)) (identifier)))
