1 // clang-format off
2 // REQUIRES: lld, x86
3 
4 // Test that we can display tag types.
5 // RUN: %clang_cl --target=x86_64-windows-msvc -GS- -Od -Z7 -c /Fo%t.obj -- %s
6 // RUN: lld-link -debug:full -nodefaultlib -entry:main %t.obj -out:%t.exe -pdb:%t.pdb
7 // RUN: env LLDB_USE_NATIVE_PDB_READER=1 %lldb -f %t.exe -s \
8 // RUN:     %p/Inputs/tag-types.lldbinit | FileCheck %s
9 
10 // Test struct
11 struct Struct {
12   // Test builtin types, which are represented by special CodeView type indices.
13   bool                B;
14   char                C;
15   signed char         SC;
16   unsigned char       UC;
17   char16_t            C16;
18   char32_t            C32;
19   wchar_t             WC;
20   short               S;
21   unsigned short      US;
22   int                 I;
23   unsigned int        UI;
24   long                L;
25   unsigned long       UL;
26   long long           LL;
27   unsigned long long  ULL;
28   float               F;
29   double              D;
30   long double         LD;
31 };
32 
33 // Test class
34 class Class {
35 public:
36   // Test pointers to builtin types, which are represented by different special
37   // CodeView type indices.
38   bool                *PB;
39   char                *PC;
40   signed char         *PSC;
41   unsigned char       *PUC;
42   char16_t            *PC16;
43   char32_t            *PC32;
44   wchar_t             *PWC;
45   short               *PS;
46   unsigned short      *PUS;
47   int                 *PI;
48   unsigned int        *PUI;
49   long                *PL;
50   unsigned long       *PUL;
51   long long           *PLL;
52   unsigned long long  *PULL;
53   float               *PF;
54   double              *PD;
55   long double         *PLD;
56 };
57 
58 // Test union
59 union Union {
60   // Test modified types.
61   const bool                *PB;
62   const char                *PC;
63   const signed char         *PSC;
64   const unsigned char       *PUC;
65   const char16_t            *PC16;
66   const char32_t            *PC32;
67   const wchar_t             *PWC;
68   const short               *PS;
69   const unsigned short      *PUS;
70   const int                 *PI;
71   const unsigned int        *PUI;
72   const long                *PL;
73   const unsigned long       *PUL;
74   const long long           *PLL;
75   const unsigned long long  *PULL;
76   const float               *PF;
77   const double              *PD;
78   const long double         *PLD;
79 };
80 
81 struct OneMember {
82   int N = 0;
83 };
84 
85 
86 // Test single inheritance.
87 class Derived : public Class {
88 public:
Derived()89   explicit Derived()
90     : Reference(*this), RefMember(Member), RValueRefMember((OneMember&&)Member) {}
91 
92   // Test reference to self, to make sure we don't end up in an
93   // infinite cycle.
94   Derived &Reference;
95 
96   // Test aggregate class member.
97   OneMember Member;
98 
99   // And modified aggregate class member.
100   const OneMember ConstMember;
101   volatile OneMember VolatileMember;
102   const volatile OneMember CVMember;
103 
104   // And all types of pointers to class members
105   OneMember *PtrMember;
106   OneMember &RefMember;
107   OneMember &&RValueRefMember;
108 };
109 
110 // Test multiple inheritance, as well as protected and private inheritance.
111 class Derived2 : protected Class, private Struct {
112 public:
113   // Test static data members
114   static unsigned StaticDataMember;
115 };
116 
117 unsigned Derived2::StaticDataMember = 0;
118 
119 // Test virtual inheritance.
120 class DerivedVirtual1 : public virtual Class {};
121 
122 // Test the correctness of the virtual bases order.
123 class DerivedVirtual2 : public DerivedVirtual1, public virtual OneMember {};
124 
125 // Test scoped enums and unscoped enums.
126 enum class EnumInt {
127   A = 1,
128   B = 2
129 };
130 
131 // Test explicit underlying types
132 enum EnumShort : short {
133   ES_A = 2,
134   ES_B = 3
135 };
136 
main(int argc,char ** argv)137 int main(int argc, char **argv) {
138   Struct S;
139   Class C;
140   Union U;
141   Derived D;
142   Derived2 D2;
143   DerivedVirtual1 DV1;
144   DerivedVirtual2 DV2;
145   EnumInt EI;
146   EnumShort ES;
147 
148   return 0;
149 }
150 
151 // CHECK:      (lldb) target create "{{.*}}tag-types.cpp.tmp.exe"
152 // CHECK-NEXT: Current executable set to '{{.*}}tag-types.cpp.tmp.exe'
153 // CHECK-NEXT: (lldb) command source -s 0 '{{.*}}tag-types.lldbinit'
154 // CHECK-NEXT: Executing commands in '{{.*}}tag-types.lldbinit'.
155 // CHECK-NEXT: (lldb) type lookup -- Struct
156 // CHECK-NEXT: struct Struct {
157 // CHECK-NEXT:     bool B;
158 // CHECK-NEXT:     char C;
159 // CHECK-NEXT:     signed char SC;
160 // CHECK-NEXT:     unsigned char UC;
161 // CHECK-NEXT:     char16_t C16;
162 // CHECK-NEXT:     char32_t C32;
163 // CHECK-NEXT:     wchar_t WC;
164 // CHECK-NEXT:     short S;
165 // CHECK-NEXT:     unsigned short US;
166 // CHECK-NEXT:     int I;
167 // CHECK-NEXT:     unsigned int UI;
168 // CHECK-NEXT:     long L;
169 // CHECK-NEXT:     unsigned long UL;
170 // CHECK-NEXT:     long long LL;
171 // CHECK-NEXT:     unsigned long long ULL;
172 // CHECK-NEXT:     float F;
173 // CHECK-NEXT:     double D;
174 // CHECK-NEXT:     double LD;
175 // CHECK-NEXT: }
176 // CHECK-NEXT: (lldb) type lookup -- Class
177 // CHECK-NEXT: class Class {
178 // CHECK-NEXT:     bool *PB;
179 // CHECK-NEXT:     char *PC;
180 // CHECK-NEXT:     signed char *PSC;
181 // CHECK-NEXT:     unsigned char *PUC;
182 // CHECK-NEXT:     char16_t *PC16;
183 // CHECK-NEXT:     char32_t *PC32;
184 // CHECK-NEXT:     wchar_t *PWC;
185 // CHECK-NEXT:     short *PS;
186 // CHECK-NEXT:     unsigned short *PUS;
187 // CHECK-NEXT:     int *PI;
188 // CHECK-NEXT:     unsigned int *PUI;
189 // CHECK-NEXT:     long *PL;
190 // CHECK-NEXT:     unsigned long *PUL;
191 // CHECK-NEXT:     long long *PLL;
192 // CHECK-NEXT:     unsigned long long *PULL;
193 // CHECK-NEXT:     float *PF;
194 // CHECK-NEXT:     double *PD;
195 // CHECK-NEXT:     double *PLD;
196 // CHECK-NEXT: }
197 // CHECK-NEXT: (lldb) type lookup -- Union
198 // CHECK-NEXT: union Union {
199 // CHECK-NEXT:     const bool *PB;
200 // CHECK-NEXT:     const char *PC;
201 // CHECK-NEXT:     const signed char *PSC;
202 // CHECK-NEXT:     const unsigned char *PUC;
203 // CHECK-NEXT:     const char16_t *PC16;
204 // CHECK-NEXT:     const char32_t *PC32;
205 // CHECK-NEXT:     const wchar_t *PWC;
206 // CHECK-NEXT:     const short *PS;
207 // CHECK-NEXT:     const unsigned short *PUS;
208 // CHECK-NEXT:     const int *PI;
209 // CHECK-NEXT:     const unsigned int *PUI;
210 // CHECK-NEXT:     const long *PL;
211 // CHECK-NEXT:     const unsigned long *PUL;
212 // CHECK-NEXT:     const long long *PLL;
213 // CHECK-NEXT:     const unsigned long long *PULL;
214 // CHECK-NEXT:     const float *PF;
215 // CHECK-NEXT:     const double *PD;
216 // CHECK-NEXT:     const double *PLD;
217 // CHECK-NEXT: }
218 // CHECK-NEXT: (lldb) type lookup -- Derived
219 // CHECK-NEXT: class Derived : public Class {
220 // CHECK:          Derived &Reference;
221 // CHECK-NEXT:     OneMember Member;
222 // CHECK-NEXT:     const OneMember ConstMember;
223 // CHECK-NEXT:     volatile OneMember VolatileMember;
224 // CHECK-NEXT:     const volatile OneMember CVMember;
225 // CHECK-NEXT:     OneMember *PtrMember;
226 // CHECK-NEXT:     OneMember &RefMember;
227 // CHECK-NEXT:     OneMember &&RValueRefMember;
228 // CHECK:      }
229 // CHECK-NEXT: (lldb) type lookup -- Derived2
230 // CHECK-NEXT: class Derived2 : protected Class, private Struct {
231 // CHECK-NEXT:     static unsigned int StaticDataMember;
232 // CHECK-NEXT: }
233 // CHECK-NEXT: (lldb) type lookup -- DerivedVirtual1
234 // CHECK-NEXT: class DerivedVirtual1 : virtual public Class {
235 // CHECK-NEXT: }
236 // CHECK-NEXT: (lldb) type lookup -- DerivedVirtual2
237 // CHECK-NEXT: class DerivedVirtual2 : public DerivedVirtual1, virtual public Class, virtual public OneMember {
238 // CHECK-NEXT: }
239 // CHECK-NEXT: (lldb) type lookup -- EnumInt
240 // CHECK-NEXT: enum EnumInt {
241 // CHECK-NEXT:     A,
242 // CHECK-NEXT:     B
243 // CHECK-NEXT: }
244 // CHECK-NEXT: (lldb) type lookup -- EnumShort
245 // CHECK-NEXT: enum EnumShort {
246 // CHECK-NEXT:     ES_A,
247 // CHECK-NEXT:     ES_B
248 // CHECK-NEXT: }
249 // CHECK-NEXT: (lldb) type lookup -- InvalidType
250 // CHECK-NEXT: no type was found matching 'InvalidType'
251