xref: /llvm-project/clang/test/Modules/Inputs/DebugCXX.h (revision c5e3647f3cc663d20d8285fa16aa48c44d08218c)
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