1*67e74705SXin Li /* -*- C++ -*- */ 2*67e74705SXin Li namespace DebugCXX { 3*67e74705SXin Li // Records. 4*67e74705SXin Li struct Struct { 5*67e74705SXin Li int i; 6*67e74705SXin Li static int static_member; 7*67e74705SXin Li }; 8*67e74705SXin Li 9*67e74705SXin Li // Enums. 10*67e74705SXin Li enum Enum { 11*67e74705SXin Li Enumerator 12*67e74705SXin Li }; 13*67e74705SXin Li enum { 14*67e74705SXin Li e1 = '1' 15*67e74705SXin Li }; 16*67e74705SXin Li enum { 17*67e74705SXin Li e2 = '2' 18*67e74705SXin Li }; 19*67e74705SXin Li 20*67e74705SXin Li // Templates (instantiations). 21*67e74705SXin Li template<typename T> struct traits {}; 22*67e74705SXin Li template<typename T, 23*67e74705SXin Li typename Traits = traits<T> 24*67e74705SXin Li > class Template { 25*67e74705SXin Li T member; 26*67e74705SXin Li }; 27*67e74705SXin Li // Explicit template instantiation. 28*67e74705SXin Li extern template class Template<int>; 29*67e74705SXin Li 30*67e74705SXin Li extern template struct traits<float>; 31*67e74705SXin Li typedef class Template<float> FloatInstantiation; 32*67e74705SXin Li 33*67e74705SXin Li inline void fn() { 34*67e74705SXin Li Template<long> invisible; 35*67e74705SXin Li } 36*67e74705SXin Li 37*67e74705SXin Li // Non-template inside a template. 38*67e74705SXin Li template <class> struct Outer { 39*67e74705SXin Li Outer(); 40*67e74705SXin Li struct Inner { 41*67e74705SXin Li Inner(Outer) {} 42*67e74705SXin Li }; 43*67e74705SXin Li }; 44*67e74705SXin Li template <class T> Outer<T>::Outer() { 45*67e74705SXin Li Inner a(*this); 46*67e74705SXin Li }; 47*67e74705SXin Li 48*67e74705SXin Li // Partial template specialization. 49*67e74705SXin Li template <typename...> class A; 50*67e74705SXin Li template <typename T> class A<T> {}; 51*67e74705SXin Li typedef A<void> B; 52*67e74705SXin Li // Anchored by a function parameter. 53*67e74705SXin Li void foo(B) {} 54*67e74705SXin Li } 55*67e74705SXin Li 56*67e74705SXin Li // Virtual class with a forward declaration. 57*67e74705SXin Li class FwdVirtual; 58*67e74705SXin Li class FwdVirtual { 59*67e74705SXin Li virtual ~FwdVirtual() {} 60*67e74705SXin Li }; 61*67e74705SXin Li 62*67e74705SXin Li struct PureForwardDecl; 63*67e74705SXin Li 64*67e74705SXin Li typedef union { int i; } TypedefUnion; 65*67e74705SXin Li typedef enum { e0 = 0 } TypedefEnum; 66*67e74705SXin Li typedef struct { int i; } TypedefStruct; 67*67e74705SXin Li 68*67e74705SXin Li union { int i; } GlobalUnion; 69*67e74705SXin Li struct { int i; } GlobalStruct; 70*67e74705SXin Li enum { e5 = 5 } GlobalEnum; 71*67e74705SXin Li 72*67e74705SXin Li namespace { 73*67e74705SXin Li namespace { 74*67e74705SXin Li struct InAnonymousNamespace { int i; }; 75*67e74705SXin Li } 76*67e74705SXin Li } 77*67e74705SXin Li 78*67e74705SXin Li class Base; 79*67e74705SXin Li class A { 80*67e74705SXin Li virtual Base *getParent() const; 81*67e74705SXin Li }; 82*67e74705SXin Li class Base {}; 83*67e74705SXin Li class Derived : Base { 84*67e74705SXin Li class B : A { 85*67e74705SXin Li Derived *getParent() const override; 86*67e74705SXin Li }; 87*67e74705SXin Li }; 88*67e74705SXin Li 89*67e74705SXin Li template <class T> 90*67e74705SXin Li class Template1 { 91*67e74705SXin Li T t; 92*67e74705SXin Li }; 93*67e74705SXin Li typedef Template1<void *> TypedefTemplate; 94*67e74705SXin Li extern template class Template1<int>; 95*67e74705SXin Li 96*67e74705SXin Li template <class T> class FwdDeclTemplate; 97*67e74705SXin Li typedef FwdDeclTemplate<int> TypedefFwdDeclTemplate; 98*67e74705SXin Li 99*67e74705SXin Li // Member classes of class template specializations. 100*67e74705SXin Li template <typename T> struct Specialized {}; 101*67e74705SXin Li 102*67e74705SXin Li template <> struct Specialized<int> { 103*67e74705SXin Li struct Member; 104*67e74705SXin Li }; 105*67e74705SXin Li 106*67e74705SXin Li template <class T> struct FwdDeclTemplateMember { struct Member; }; 107*67e74705SXin Li typedef FwdDeclTemplateMember<int>::Member TypedefFwdDeclTemplateMember; 108