1 // clang-format off
2 // REQUIRES: lld
3 
4 // Test that we can display tag types.
5 // RUN: %build --compiler=clang-cl --nodefaultlib -o %t.exe -- %s
6 // RUN: env LLDB_USE_NATIVE_PDB_READER=1 %lldb -f %t.exe -s \
7 // RUN:     %p/Inputs/globals-classes.lldbinit | FileCheck %s
8 
9 enum class EnumType : unsigned {
10   A = 1,
11   B = 2
12 };
13 
14 class ClassNoPadding {
15   /* [ 0] */ unsigned char a = 86;
16   /* [ 1] */ char b = 'a';
17   /* [ 2] */ bool c = false;
18   /* [ 3] */ bool d = true;
19   /* [ 4] */ short e = -1234;
20   /* [ 6] */ unsigned short f = 8123;
21   /* [ 8] */ unsigned int g = 123908;
22   /* [12] */ int h = -890234;
23   /* [16] */ unsigned long i = 2908234;
24   /* [20] */ long j = 7234890;
25   /* [24] */ float k = 908234.12392;
26   /* [28] */ EnumType l = EnumType::A;
27   /* [32] */ double m = 23890.897423;
28   /* [40] */ unsigned long long n = 23490782;
29   /* [48] */ long long o = -923409823;
30   /* [56] */ int p[5] = { 2, 3, 5, 8, 13 };
31 };
32 
33 class ClassWithPadding {
34   /* [ 0] */ char a = '0';
35   //         char padding[1];
36   /* [ 2] */ short b = 50;
37   /* [ 4] */ char c[2] = { '0', '1' };
38   //         char padding[2];
39   /* [ 8] */ int d = 100;
40   /* [12] */ char e = '0';
41   //         char padding[3];
42   /* [16] */ int f = 200;
43   //         char padding[4];
44   /* [24] */ long long g = 300;
45   /* [32] */ char h[3] = { '0', '1', '2' };
46   //         char padding[5];
47   /* [40] */ long long i = 400;
48   /* [48] */ char j[2] = { '0', '1' };
49   //         char padding[6];
50   /* [56] */ long long k = 500;
51   /* [64] */ char l = '0';
52   //         char padding[7];
53   /* [72] */ long long m = 600;
54 } ;
55 
56 struct EmptyBase {};
57 
58 template<typename T>
59 struct BaseClass {
60   constexpr BaseClass(int N)
61     : BaseMember(N) {}
62 
63   int BaseMember;
64 };
65 
66 struct DerivedClass : public BaseClass<int> {
67   constexpr DerivedClass(int Base, int Derived)
68     : BaseClass(Base), DerivedMember(Derived) {}
69 
70   int DerivedMember;
71 };
72 
73 struct EBO : public EmptyBase {
74   constexpr EBO(int N) : Member(N) {}
75   int Member;
76 };
77 
78 struct PaddedBases : public BaseClass<char>, public BaseClass<short>, BaseClass<int> {
79   constexpr PaddedBases(char CH, short S, int N, long long D)
80     : BaseClass<char>(CH), BaseClass<short>(S), BaseClass<int>(N), DerivedMember(D) {}
81   long long DerivedMember;
82 };
83 
84 struct Statics {
85   static char a;
86   static bool b;
87   static short c;
88   static unsigned short d;
89   static unsigned int e;
90   static int f;
91   static unsigned long g;
92   static long h;
93   static float i;
94   static EnumType j;
95   static double k;
96   static unsigned long long l;
97   static long long m;
98 };
99 
100 char Statics::a = 'a';
101 bool Statics::b = true;
102 short Statics::c = 1234;
103 unsigned short Statics::d = 2345;
104 unsigned int Statics::e = 3456;
105 int Statics::f = 4567;
106 unsigned long Statics::g = 5678;
107 long Statics::h = 6789;
108 float Statics::i = 7890.1234;
109 EnumType Statics::j = EnumType::A;
110 double Statics::k = 8901.2345;
111 unsigned long long Statics::l = 9012345;
112 long long Statics::m = 1234567;
113 
114 
115 struct Pointers {
116   void *a = nullptr;
117   char *b = &Statics::a;
118   bool *c = &Statics::b;
119   short *e = &Statics::c;
120   unsigned short *f = &Statics::d;
121   unsigned int *g = &Statics::e;
122   int *h = &Statics::f;
123   unsigned long *i = &Statics::g;
124   long *j = &Statics::h;
125   float *k = &Statics::i;
126   EnumType *l = &Statics::j;
127   double *m = &Statics::k;
128   unsigned long long *n = &Statics::l;
129   long long *o = &Statics::m;
130 };
131 
132 struct References {
133   char &a = Statics::a;
134   bool &b = Statics::b;
135   short &c = Statics::c;
136   unsigned short &d = Statics::d;
137   unsigned int &e = Statics::e;
138   int &f = Statics::f;
139   unsigned long &g = Statics::g;
140   long &h = Statics::h;
141   float &i = Statics::i;
142   EnumType &j = Statics::j;
143   double &k = Statics::k;
144   unsigned long long &l = Statics::l;
145   long long &m = Statics::m;
146 };
147 
148 
149 constexpr ClassWithPadding ClassWithPaddingInstance;
150 // CHECK:      (lldb) target variable -T ClassWithPaddingInstance
151 // CHECK-NEXT: (const ClassWithPadding) ClassWithPaddingInstance = {
152 // CHECK-NEXT:   (char) a = '0'
153 // CHECK-NEXT:   (short) b = 50
154 // CHECK-NEXT:   (char [2]) c = "01"
155 // CHECK-NEXT:   (int) d = 100
156 // CHECK-NEXT:   (char) e = '0'
157 // CHECK-NEXT:   (int) f = 200
158 // CHECK-NEXT:   (long long) g = 300
159 // CHECK-NEXT:   (char [3]) h = "012"
160 // CHECK-NEXT:   (long long) i = 400
161 // CHECK-NEXT:   (char [2]) j = "01"
162 // CHECK-NEXT:   (long long) k = 500
163 // CHECK-NEXT:   (char) l = '0'
164 // CHECK-NEXT:   (long long) m = 600
165 // CHECK-NEXT: }
166 
167 constexpr ClassNoPadding ClassNoPaddingInstance;
168 // CHECK:      (lldb) target variable -T ClassNoPaddingInstance
169 // CHECK-NEXT: (const ClassNoPadding) ClassNoPaddingInstance = {
170 // CHECK-NEXT:   (unsigned char) a = 'V'
171 // CHECK-NEXT:   (char) b = 'a'
172 // CHECK-NEXT:   (bool) c = false
173 // CHECK-NEXT:   (bool) d = true
174 // CHECK-NEXT:   (short) e = -1234
175 // CHECK-NEXT:   (unsigned short) f = 8123
176 // CHECK-NEXT:   (unsigned int) g = 123908
177 // CHECK-NEXT:   (int) h = -890234
178 // CHECK-NEXT:   (unsigned long) i = 2908234
179 // CHECK-NEXT:   (long) j = 7234890
180 // CHECK-NEXT:   (float) k = 908234.125
181 // CHECK-NEXT:   (EnumType) l = A
182 // CHECK-NEXT:   (double) m = 23890.897422999999
183 // CHECK-NEXT:   (unsigned long long) n = 23490782
184 // CHECK-NEXT:     (long long) o = -923409823
185 // CHECK-NEXT:     (int [5]) p = {
186 // CHECK-NEXT:       (int) [0] = 2
187 // CHECK-NEXT:       (int) [1] = 3
188 // CHECK-NEXT:       (int) [2] = 5
189 // CHECK-NEXT:       (int) [3] = 8
190 // CHECK-NEXT:       (int) [4] = 13
191 // CHECK-NEXT:     }
192 // CHECK-NEXT:   }
193 
194 constexpr DerivedClass DC(10, 20);
195 // CHECK:      (lldb) target variable -T DC
196 // CHECK-NEXT: (const DerivedClass) DC = {
197 // CHECK-NEXT:   (BaseClass<int>) BaseClass<int> = {
198 // CHECK-NEXT:     (int) BaseMember = 10
199 // CHECK-NEXT:   }
200 // CHECK-NEXT:   (int) DerivedMember = 20
201 // CHECK-NEXT: }
202 
203 constexpr EBO EBOC(20);
204 // CHECK:      (lldb) target variable -T EBOC
205 // CHECK-NEXT: (const EBO) EBOC = {
206 // CHECK-NEXT:   (int) Member = 20
207 // CHECK-NEXT: }
208 
209 constexpr PaddedBases PBC('a', 12, 120, 1200);
210 // CHECK:      (lldb) target variable -T PBC
211 // CHECK-NEXT: (const PaddedBases) PBC = {
212 // CHECK-NEXT:   (BaseClass<char>) BaseClass<char> = {
213 // CHECK-NEXT:     (int) BaseMember = 97
214 // CHECK-NEXT:   }
215 // CHECK-NEXT:   (BaseClass<short>) BaseClass<short> = {
216 // CHECK-NEXT:     (int) BaseMember = 12
217 // CHECK-NEXT:   }
218 // CHECK-NEXT:   (BaseClass<int>) BaseClass<int> = {
219 // CHECK-NEXT:     (int) BaseMember = 120
220 // CHECK-NEXT:   }
221 // CHECK-NEXT:   (long long) DerivedMember = 1200
222 // CHECK-NEXT: }
223 
224 constexpr struct {
225   int x = 12;
226   EBO EBOC{ 42 };
227 } UnnamedClassInstance;
228 // CHECK:      (lldb) target variable -T UnnamedClassInstance
229 // CHECK-NEXT: (const <unnamed-type-UnnamedClassInstance>) UnnamedClassInstance = {
230 // CHECK-NEXT:   (int) x = 12
231 // CHECK-NEXT:   (EBO) EBOC = {
232 // CHECK-NEXT:     (int) Member = 42
233 // CHECK-NEXT:   }
234 // CHECK-NEXT: }
235 
236 constexpr Pointers PointersInstance;
237 // CHECK:      (lldb) target variable -T PointersInstance
238 // CHECK-NEXT: (const Pointers) PointersInstance = {
239 // CHECK-NEXT:   (void *) a = {{.*}}
240 // CHECK-NEXT:   (char *) b = {{.*}}
241 // CHECK-NEXT:   (bool *) c = {{.*}}
242 // CHECK-NEXT:   (short *) e = {{.*}}
243 // CHECK-NEXT:   (unsigned short *) f = {{.*}}
244 // CHECK-NEXT:   (unsigned int *) g = {{.*}}
245 // CHECK-NEXT:   (int *) h = {{.*}}
246 // CHECK-NEXT:   (unsigned long *) i = {{.*}}
247 // CHECK-NEXT:   (long *) j = {{.*}}
248 // CHECK-NEXT:   (float *) k = {{.*}}
249 // CHECK-NEXT:   (EnumType *) l = {{.*}}
250 // CHECK-NEXT:   (double *) m = {{.*}}
251 // CHECK-NEXT:   (unsigned long long *) n = {{.*}}
252 // CHECK-NEXT:   (long long *) o = {{.*}}
253 // CHECK-NEXT: }
254 constexpr References ReferencesInstance;
255 // CHECK:      (lldb) target variable -T ReferencesInstance
256 // CHECK-NEXT: (const References) ReferencesInstance = {
257 // CHECK-NEXT:   (char &) a = {{.*}}
258 // CHECK-NEXT:   (bool &) b = {{.*}}
259 // CHECK-NEXT:   (short &) c = {{.*}}
260 // CHECK-NEXT:   (unsigned short &) d = {{.*}}
261 // CHECK-NEXT:   (unsigned int &) e = {{.*}}
262 // CHECK-NEXT:   (int &) f = {{.*}}
263 // CHECK-NEXT:   (unsigned long &) g = {{.*}}
264 // CHECK-NEXT:   (long &) h = {{.*}}
265 // CHECK-NEXT:   (float &) i = {{.*}}
266 // CHECK-NEXT:   (EnumType &) j = {{.*}}
267 // CHECK-NEXT:   (double &) k = {{.*}}
268 // CHECK-NEXT:   (unsigned long long &) l = {{.*}}
269 // CHECK-NEXT:   (long long &) m = {{.*}}
270 // CHECK-NEXT: }
271 
272 // CHECK: Dumping clang ast for 1 modules.
273 // CHECK: TranslationUnitDecl {{.*}}
274 // CHECK: |-CXXRecordDecl {{.*}} class ClassWithPadding definition
275 // CHECK: | |-FieldDecl {{.*}} a 'char'
276 // CHECK: | |-FieldDecl {{.*}} b 'short'
277 // CHECK: | |-FieldDecl {{.*}} c 'char [2]'
278 // CHECK: | |-FieldDecl {{.*}} d 'int'
279 // CHECK: | |-FieldDecl {{.*}} e 'char'
280 // CHECK: | |-FieldDecl {{.*}} f 'int'
281 // CHECK: | |-FieldDecl {{.*}} g 'long long'
282 // CHECK: | |-FieldDecl {{.*}} h 'char [3]'
283 // CHECK: | |-FieldDecl {{.*}} i 'long long'
284 // CHECK: | |-FieldDecl {{.*}} j 'char [2]'
285 // CHECK: | |-FieldDecl {{.*}} k 'long long'
286 // CHECK: | |-FieldDecl {{.*}} l 'char'
287 // CHECK: | `-FieldDecl {{.*}} m 'long long'
288 // CHECK: |-VarDecl {{.*}} ClassWithPaddingInstance 'const ClassWithPadding'
289 // CHECK: |-CXXRecordDecl {{.*}} class ClassNoPadding definition
290 // CHECK: | |-FieldDecl {{.*}} a 'unsigned char'
291 // CHECK: | |-FieldDecl {{.*}} b 'char'
292 // CHECK: | |-FieldDecl {{.*}} c 'bool'
293 // CHECK: | |-FieldDecl {{.*}} d 'bool'
294 // CHECK: | |-FieldDecl {{.*}} e 'short'
295 // CHECK: | |-FieldDecl {{.*}} f 'unsigned short'
296 // CHECK: | |-FieldDecl {{.*}} g 'unsigned int'
297 // CHECK: | |-FieldDecl {{.*}} h 'int'
298 // CHECK: | |-FieldDecl {{.*}} i 'unsigned long'
299 // CHECK: | |-FieldDecl {{.*}} j 'long'
300 // CHECK: | |-FieldDecl {{.*}} k 'float'
301 // CHECK: | |-FieldDecl {{.*}} l 'EnumType'
302 // CHECK: | |-FieldDecl {{.*}} m 'double'
303 // CHECK: | |-FieldDecl {{.*}} n 'unsigned long long'
304 // CHECK: | |-FieldDecl {{.*}} o 'long long'
305 // CHECK: | `-FieldDecl {{.*}} p 'int [5]'
306 // CHECK: |-VarDecl {{.*}} ClassNoPaddingInstance 'const ClassNoPadding'
307 // CHECK: |-EnumDecl {{.*}} EnumType
308 // CHECK: | |-EnumConstantDecl {{.*}} A 'EnumType'
309 // CHECK: | `-EnumConstantDecl {{.*}} B 'EnumType'
310 // CHECK: |-CXXRecordDecl {{.*}} struct DerivedClass definition
311 // CHECK: | |-public 'BaseClass<int>'
312 // CHECK: | |-FieldDecl {{.*}} DerivedMember 'int'
313 // CHECK: | `-CXXConstructorDecl {{.*}} DerivedClass 'void (int, int)'
314 // CHECK: |   |-ParmVarDecl {{.*}} 'int'
315 // CHECK: |   `-ParmVarDecl {{.*}} 'int'
316 // CHECK: |-VarDecl {{.*}} DC 'const DerivedClass'
317 // CHECK: |-CXXRecordDecl {{.*}} struct BaseClass<int> definition
318 // CHECK: | |-FieldDecl {{.*}} BaseMember 'int'
319 // CHECK: | `-CXXMethodDecl {{.*}} BaseClass 'void (int)'
320 // CHECK: |   `-ParmVarDecl {{.*}} 'int'
321 // CHECK: |-CXXRecordDecl {{.*}} struct EBO definition
322 // CHECK: | |-public 'EmptyBase'
323 // CHECK: | |-FieldDecl {{.*}} Member 'int'
324 // CHECK: | `-CXXConstructorDecl {{.*}} EBO 'void (int)'
325 // CHECK: |   `-ParmVarDecl {{.*}} 'int'
326 // CHECK: |-VarDecl {{.*}} EBOC 'const EBO'
327 // CHECK: |-CXXRecordDecl {{.*}} struct EmptyBase definition
328 // CHECK: |-CXXRecordDecl {{.*}} struct PaddedBases definition
329 // CHECK: | |-public 'BaseClass<char>'
330 // CHECK: | |-public 'BaseClass<short>'
331 // CHECK: | |-public 'BaseClass<int>'
332 // CHECK: | |-FieldDecl {{.*}} DerivedMember 'long long'
333 // CHECK: | `-CXXConstructorDecl {{.*}} PaddedBases 'void (char, short, int, long long)'
334 // CHECK: |   |-ParmVarDecl {{.*}} 'char'
335 // CHECK: |   |-ParmVarDecl {{.*}} 'short'
336 // CHECK: |   |-ParmVarDecl {{.*}} 'int'
337 // CHECK: |   `-ParmVarDecl {{.*}} 'long long'
338 // CHECK: |-VarDecl {{.*}} PBC 'const PaddedBases'
339 // CHECK: |-CXXRecordDecl {{.*}} struct BaseClass<char> definition
340 // CHECK: | |-FieldDecl {{.*}} BaseMember 'int'
341 // CHECK: | `-CXXMethodDecl {{.*}} BaseClass 'void (int)'
342 // CHECK: |   `-ParmVarDecl {{.*}} 'int'
343 // CHECK: |-CXXRecordDecl {{.*}} struct BaseClass<short> definition
344 // CHECK: | |-FieldDecl {{.*}} BaseMember 'int'
345 // CHECK: | `-CXXMethodDecl {{.*}} BaseClass 'void (int)'
346 // CHECK: |   `-ParmVarDecl {{.*}} 'int'
347 // CHECK: |-CXXRecordDecl {{.*}} struct <unnamed-type-UnnamedClassInstance> definition
348 // CHECK: | |-FieldDecl {{.*}} x 'int'
349 // CHECK: | `-FieldDecl {{.*}} EBOC 'EBO'
350 // CHECK: |-VarDecl {{.*}} UnnamedClassInstance 'const <unnamed-type-UnnamedClassInstance>'
351 // CHECK: |-CXXRecordDecl {{.*}} struct Pointers definition
352 // CHECK: | |-FieldDecl {{.*}} a 'void *'
353 // CHECK: | |-FieldDecl {{.*}} b 'char *'
354 // CHECK: | |-FieldDecl {{.*}} c 'bool *'
355 // CHECK: | |-FieldDecl {{.*}} e 'short *'
356 // CHECK: | |-FieldDecl {{.*}} f 'unsigned short *'
357 // CHECK: | |-FieldDecl {{.*}} g 'unsigned int *'
358 // CHECK: | |-FieldDecl {{.*}} h 'int *'
359 // CHECK: | |-FieldDecl {{.*}} i 'unsigned long *'
360 // CHECK: | |-FieldDecl {{.*}} j 'long *'
361 // CHECK: | |-FieldDecl {{.*}} k 'float *'
362 // CHECK: | |-FieldDecl {{.*}} l 'EnumType *'
363 // CHECK: | |-FieldDecl {{.*}} m 'double *'
364 // CHECK: | |-FieldDecl {{.*}} n 'unsigned long long *'
365 // CHECK: | `-FieldDecl {{.*}} o 'long long *'
366 // CHECK: |-VarDecl {{.*}} PointersInstance 'const Pointers'
367 // CHECK: |-CXXRecordDecl {{.*}} struct References definition
368 // CHECK: | |-FieldDecl {{.*}} a 'char &'
369 // CHECK: | |-FieldDecl {{.*}} b 'bool &'
370 // CHECK: | |-FieldDecl {{.*}} c 'short &'
371 // CHECK: | |-FieldDecl {{.*}} d 'unsigned short &'
372 // CHECK: | |-FieldDecl {{.*}} e 'unsigned int &'
373 // CHECK: | |-FieldDecl {{.*}} f 'int &'
374 // CHECK: | |-FieldDecl {{.*}} g 'unsigned long &'
375 // CHECK: | |-FieldDecl {{.*}} h 'long &'
376 // CHECK: | |-FieldDecl {{.*}} i 'float &'
377 // CHECK: | |-FieldDecl {{.*}} j 'EnumType &'
378 // CHECK: | |-FieldDecl {{.*}} k 'double &'
379 // CHECK: | |-FieldDecl {{.*}} l 'unsigned long long &'
380 // CHECK: | `-FieldDecl {{.*}} m 'long long &'
381 // CHECK: `-VarDecl {{.*}} ReferencesInstance 'const References'
382 
383 int main(int argc, char **argv) {
384   return 0;
385 }
386