14aa2b3a3SAdrian Prantl /* -*- C++ -*- */ 2*c5e3647fSAdrian Prantl 3*c5e3647fSAdrian Prantl #include "dummy.h" 4*c5e3647fSAdrian Prantl 54aa2b3a3SAdrian Prantl namespace DebugCXX { 64aa2b3a3SAdrian Prantl // Records. 74aa2b3a3SAdrian Prantl struct Struct { 84aa2b3a3SAdrian Prantl int i; 94aa2b3a3SAdrian Prantl static int static_member; 104aa2b3a3SAdrian Prantl }; 114aa2b3a3SAdrian Prantl 124aa2b3a3SAdrian Prantl // Enums. 134aa2b3a3SAdrian Prantl enum Enum { 144aa2b3a3SAdrian Prantl Enumerator 154aa2b3a3SAdrian Prantl }; 164aa2b3a3SAdrian Prantl enum { 174aa2b3a3SAdrian Prantl e1 = '1' 184aa2b3a3SAdrian Prantl }; 194aa2b3a3SAdrian Prantl enum { 204aa2b3a3SAdrian Prantl e2 = '2' 214aa2b3a3SAdrian Prantl }; 224aa2b3a3SAdrian Prantl 23b2a8b353SAdrian Prantl // Templates (instantiations). 244aa2b3a3SAdrian Prantl template<typename T> struct traits {}; 254aa2b3a3SAdrian Prantl template<typename T, 264aa2b3a3SAdrian Prantl typename Traits = traits<T> 274aa2b3a3SAdrian Prantl > class Template { 284aa2b3a3SAdrian Prantl T member; 294aa2b3a3SAdrian Prantl }; 3005fefa4aSAdrian Prantl // Explicit template instantiation. 314aa2b3a3SAdrian Prantl extern template class Template<int>; 324aa2b3a3SAdrian Prantl 334aa2b3a3SAdrian Prantl extern template struct traits<float>; 3405fefa4aSAdrian Prantl typedef class Template<float> FloatInstantiation; 354aa2b3a3SAdrian Prantl 364aa2b3a3SAdrian Prantl inline void fn() { 374aa2b3a3SAdrian Prantl Template<long> invisible; 384aa2b3a3SAdrian Prantl } 394aa2b3a3SAdrian Prantl 404aa2b3a3SAdrian Prantl // Non-template inside a template. 414aa2b3a3SAdrian Prantl template <class> struct Outer { 424aa2b3a3SAdrian Prantl Outer(); 434aa2b3a3SAdrian Prantl struct Inner { 444aa2b3a3SAdrian Prantl Inner(Outer) {} 454aa2b3a3SAdrian Prantl }; 464aa2b3a3SAdrian Prantl }; 474aa2b3a3SAdrian Prantl template <class T> Outer<T>::Outer() { 484aa2b3a3SAdrian Prantl Inner a(*this); 494aa2b3a3SAdrian Prantl }; 504aa2b3a3SAdrian Prantl 514aa2b3a3SAdrian Prantl // Partial template specialization. 524aa2b3a3SAdrian Prantl template <typename...> class A; 534aa2b3a3SAdrian Prantl template <typename T> class A<T> {}; 544aa2b3a3SAdrian Prantl typedef A<void> B; 5505fefa4aSAdrian Prantl // Anchored by a function parameter. 564aa2b3a3SAdrian Prantl void foo(B) {} 574aa2b3a3SAdrian Prantl } 58b3b821f1SAdrian Prantl 59b3b821f1SAdrian Prantl // Virtual class with a forward declaration. 60a43acdc4SAdrian Prantl struct Virtual; 61a43acdc4SAdrian Prantl struct Virtual { 62a43acdc4SAdrian Prantl virtual ~Virtual() {} 63b3b821f1SAdrian Prantl }; 6435e765baSAdrian Prantl 6535e765baSAdrian Prantl struct PureForwardDecl; 66e5238d2aSAdrian Prantl 67e5238d2aSAdrian Prantl typedef union { int i; } TypedefUnion; 68e5238d2aSAdrian Prantl typedef enum { e0 = 0 } TypedefEnum; 69e5238d2aSAdrian Prantl typedef struct { int i; } TypedefStruct; 70cd975018SAdrian Prantl 71cd975018SAdrian Prantl union { int i; } GlobalUnion; 72cd975018SAdrian Prantl struct { int i; } GlobalStruct; 73cd975018SAdrian Prantl enum { e5 = 5 } GlobalEnum; 748f55b66aSAdrian Prantl 758f55b66aSAdrian Prantl namespace { 768f55b66aSAdrian Prantl namespace { 778f55b66aSAdrian Prantl struct InAnonymousNamespace { int i; }; 788f55b66aSAdrian Prantl } 798f55b66aSAdrian Prantl } 805a9a4277SAdrian Prantl 815a9a4277SAdrian Prantl class Base; 825a9a4277SAdrian Prantl class A { 835a9a4277SAdrian Prantl virtual Base *getParent() const; 845a9a4277SAdrian Prantl }; 855a9a4277SAdrian Prantl class Base {}; 865a9a4277SAdrian Prantl class Derived : Base { 875a9a4277SAdrian Prantl class B : A { 885a9a4277SAdrian Prantl Derived *getParent() const override; 895a9a4277SAdrian Prantl }; 905a9a4277SAdrian Prantl }; 9105fefa4aSAdrian Prantl 9205fefa4aSAdrian Prantl template <class T> 9305fefa4aSAdrian Prantl class Template1 { 9405fefa4aSAdrian Prantl T t; 9505fefa4aSAdrian Prantl }; 9605fefa4aSAdrian Prantl typedef Template1<void *> TypedefTemplate; 9705fefa4aSAdrian Prantl extern template class Template1<int>; 9805fefa4aSAdrian Prantl 9905fefa4aSAdrian Prantl template <class T> class FwdDeclTemplate; 10005fefa4aSAdrian Prantl typedef FwdDeclTemplate<int> TypedefFwdDeclTemplate; 10190931c48SAdrian Prantl 10290931c48SAdrian Prantl // Member classes of class template specializations. 1030dabc2adSAdrian Prantl template <typename T> struct Specialized {}; 10490931c48SAdrian Prantl 10590931c48SAdrian Prantl template <> struct Specialized<int> { 1060dabc2adSAdrian Prantl struct Member; 10790931c48SAdrian Prantl }; 10890931c48SAdrian Prantl 1090dabc2adSAdrian Prantl template <class T> struct FwdDeclTemplateMember { struct Member; }; 1100dabc2adSAdrian Prantl typedef FwdDeclTemplateMember<int>::Member TypedefFwdDeclTemplateMember; 11126cb1d26SAdrian Prantl 11226cb1d26SAdrian Prantl // Base class specialized on the class itself. 11326cb1d26SAdrian Prantl template <typename Derived> class BaseTemplate {}; 11426cb1d26SAdrian Prantl template <typename T> 11526cb1d26SAdrian Prantl class WithSpecializedBase : public BaseTemplate<WithSpecializedBase<T>> {}; 11626cb1d26SAdrian Prantl typedef WithSpecializedBase<float> SpecializedBase; 117