/* -*- C++ -*- */

#include "dummy.h"

namespace DebugCXX {
  // Records.
  struct Struct {
    int i;
    static int static_member;
  };

  // Enums.
  enum Enum {
    Enumerator
  };
  enum {
    e1 = '1'
  };
  enum {
    e2 = '2'
  };

  // Templates (instantiations).
  template<typename T> struct traits {};
  template<typename T,
           typename Traits = traits<T>
          > class Template {
    T member;
  };
  // Explicit template instantiation.
  extern template class Template<int>;

  extern template struct traits<float>;
  typedef class Template<float> FloatInstantiation;

  inline void fn() {
    Template<long> invisible;
  }

  // Non-template inside a template.
  template <class> struct Outer {
    Outer();
    struct Inner {
      Inner(Outer) {}
    };
  };
  template <class T> Outer<T>::Outer() {
    Inner a(*this);
  };

  // Partial template specialization.
  template <typename...> class A;
  template <typename T> class A<T> {};
  typedef A<void> B;
  // Anchored by a function parameter.
  void foo(B) {}
}

// Virtual class with a forward declaration.
struct Virtual;
struct Virtual {
  virtual ~Virtual() {}
};

struct PureForwardDecl;

typedef union { int i; } TypedefUnion;
typedef enum { e0 = 0 } TypedefEnum;
typedef struct { int i; } TypedefStruct;

union { int i; } GlobalUnion;
struct { int i; } GlobalStruct;
enum { e5 = 5 } GlobalEnum;

namespace {
  namespace {
    struct InAnonymousNamespace { int i; };
  }
}

class Base;
class A {
  virtual Base *getParent() const;
};
class Base {};
class Derived : Base {
  class B : A {
    Derived *getParent() const override;
  };
};

template <class T>
class Template1 {
  T t;
};
typedef Template1<void *> TypedefTemplate;
extern template class Template1<int>;

template <class T> class FwdDeclTemplate;
typedef FwdDeclTemplate<int> TypedefFwdDeclTemplate;

// Member classes of class template specializations.
template <typename T> struct Specialized {};

template <> struct Specialized<int> {
  struct Member;
};

template <class T> struct FwdDeclTemplateMember { struct Member; };
typedef FwdDeclTemplateMember<int>::Member TypedefFwdDeclTemplateMember;

// Base class specialized on the class itself.
template <typename Derived> class BaseTemplate {};
template <typename T>
class WithSpecializedBase : public BaseTemplate<WithSpecializedBase<T>> {};
typedef WithSpecializedBase<float> SpecializedBase;
