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