xref: /aosp_15_r20/external/clang/test/Modules/Inputs/DebugCXX.h (revision 67e74705e28f6214e480b399dd47ea732279e315)
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