1; RUN: llvm-undname < %s | FileCheck %s
2
3; CHECK-NOT: Invalid mangled name
4
5?x@@3HA
6; CHECK: int x
7
8?x@@3PEAHEA
9; CHECK: int *x
10
11?x@@3PEAPEAHEA
12; CHECK: int **x
13
14?x@@3PEAY02HEA
15; CHECK: int (*x)[3]
16
17?x@@3PEAY124HEA
18; CHECK: int (*x)[3][5]
19
20?x@@3PEAY02$$CBHEA
21; CHECK: int const (*x)[3]
22
23?x@@3PEAEEA
24; CHECK: unsigned char *x
25
26?x@@3PEAY1NKM@5HEA
27; CHECK: int (*x)[3500][6]
28
29?x@@YAXMH@Z
30; CHECK: void __cdecl x(float, int)
31
32?x@@3P6AHMNH@ZEA
33; CHECK: int __cdecl (*x)(float, double, int)
34
35?x@@3P6AHP6AHM@ZN@ZEA
36; CHECK: int __cdecl (*x)(int __cdecl (*)(float), double)
37
38?x@@3P6AHP6AHM@Z0@ZEA
39; CHECK: int __cdecl (*x)(int __cdecl (*)(float), int __cdecl (*)(float))
40
41?x@ns@@3HA
42; CHECK: int ns::x
43
44; Microsoft's undname doesn't handle Q correctly or the multiple occurrences
45; of the const modifier.  So the results here differ, but ours are correct.
46?x@@3PEAHEA
47; CHECK: int *x
48
49?x@@3PEBHEB
50; CHECK: int const *x
51
52?x@@3QEAHEA
53; CHECK: int *const x
54
55?x@@3QEBHEB
56; CHECK: int const *const x
57
58
59?x@@3AEBHEB
60; CHECK: int const &x
61
62?x@@3PEAUty@@EA
63; CHECK: struct ty *x
64
65?x@@3PEATty@@EA
66; CHECK: union ty *x
67
68?x@@3PEAUty@@EA
69; CHECK: struct ty *x
70
71?x@@3PEAW4ty@@EA
72; CHECK: enum ty *x
73
74?x@@3PEAVty@@EA
75; CHECK: class ty *x
76
77?x@@3PEAV?$tmpl@H@@EA
78; CHECK: class tmpl<int> *x
79
80?x@@3PEAU?$tmpl@H@@EA
81; CHECK: struct tmpl<int> *x
82
83?x@@3PEAT?$tmpl@H@@EA
84; CHECK: union tmpl<int> *x
85
86?instance@@3Vklass@@A
87; CHECK: class klass instance
88
89?instance$initializer$@@3P6AXXZEA
90; CHECK: void __cdecl (*instance$initializer$)(void)
91
92??0klass@@QEAA@XZ
93; CHECK: __cdecl klass::klass(void)
94
95??1klass@@QEAA@XZ
96; CHECK: __cdecl klass::~klass(void)
97
98?x@@YAHPEAVklass@@AEAV1@@Z
99; CHECK: int __cdecl x(class klass *, class klass &)
100
101?x@ns@@3PEAV?$klass@HH@1@EA
102; CHECK: class ns::klass<int, int> *ns::x
103
104?fn@?$klass@H@ns@@QEBAIXZ
105; CHECK: unsigned int __cdecl ns::klass<int>::fn(void) const
106
107
108??4klass@@QEAAAEBV0@AEBV0@@Z
109; CHECK: class klass const &__cdecl klass::operator=(class klass const &)
110
111??7klass@@QEAA_NXZ
112; CHECK: bool __cdecl klass::operator!(void)
113
114??8klass@@QEAA_NAEBV0@@Z
115; CHECK: bool __cdecl klass::operator==(class klass const &)
116
117??9klass@@QEAA_NAEBV0@@Z
118; CHECK: bool __cdecl klass::operator!=(class klass const &)
119
120??Aklass@@QEAAH_K@Z
121; CHECK: int __cdecl klass::operator[](unsigned __int64)
122
123??Cklass@@QEAAHXZ
124; CHECK: int __cdecl klass::operator->(void)
125
126??Dklass@@QEAAHXZ
127; CHECK: int __cdecl klass::operator*(void)
128
129??Eklass@@QEAAHXZ
130; CHECK: int __cdecl klass::operator++(void)
131
132??Eklass@@QEAAHH@Z
133; CHECK: int __cdecl klass::operator++(int)
134
135??Fklass@@QEAAHXZ
136; CHECK: int __cdecl klass::operator--(void)
137
138??Fklass@@QEAAHH@Z
139; CHECK: int __cdecl klass::operator--(int)
140
141??Hklass@@QEAAHH@Z
142; CHECK: int __cdecl klass::operator+(int)
143
144??Gklass@@QEAAHH@Z
145; CHECK: int __cdecl klass::operator-(int)
146
147??Iklass@@QEAAHH@Z
148; CHECK: int __cdecl klass::operator&(int)
149
150??Jklass@@QEAAHH@Z
151; CHECK: int __cdecl klass::operator->*(int)
152
153??Kklass@@QEAAHH@Z
154; CHECK: int __cdecl klass::operator/(int)
155
156??Mklass@@QEAAHH@Z
157; CHECK: int __cdecl klass::operator<(int)
158
159??Nklass@@QEAAHH@Z
160; CHECK: int __cdecl klass::operator<=(int)
161
162??Oklass@@QEAAHH@Z
163; CHECK: int __cdecl klass::operator>(int)
164
165??Pklass@@QEAAHH@Z
166; CHECK: int __cdecl klass::operator>=(int)
167
168??Qklass@@QEAAHH@Z
169; CHECK: int __cdecl klass::operator,(int)
170
171??Rklass@@QEAAHH@Z
172; CHECK: int __cdecl klass::operator()(int)
173
174??Sklass@@QEAAHXZ
175; CHECK: int __cdecl klass::operator~(void)
176
177??Tklass@@QEAAHH@Z
178; CHECK: int __cdecl klass::operator^(int)
179
180??Uklass@@QEAAHH@Z
181; CHECK: int __cdecl klass::operator|(int)
182
183??Vklass@@QEAAHH@Z
184; CHECK: int __cdecl klass::operator&&(int)
185
186??Wklass@@QEAAHH@Z
187; CHECK: int __cdecl klass::operator||(int)
188
189??Xklass@@QEAAHH@Z
190; CHECK: int __cdecl klass::operator*=(int)
191
192??Yklass@@QEAAHH@Z
193; CHECK: int __cdecl klass::operator+=(int)
194
195??Zklass@@QEAAHH@Z
196; CHECK: int __cdecl klass::operator-=(int)
197
198??_0klass@@QEAAHH@Z
199; CHECK: int __cdecl klass::operator/=(int)
200
201??_1klass@@QEAAHH@Z
202; CHECK: int __cdecl klass::operator%=(int)
203
204??_2klass@@QEAAHH@Z
205; CHECK: int __cdecl klass::operator>>=(int)
206
207??_3klass@@QEAAHH@Z
208; CHECK: int __cdecl klass::operator<<=(int)
209
210??_6klass@@QEAAHH@Z
211; CHECK: int __cdecl klass::operator^=(int)
212
213??6@YAAEBVklass@@AEBV0@H@Z
214; CHECK: class klass const &__cdecl operator<<(class klass const &, int)
215
216??5@YAAEBVklass@@AEBV0@_K@Z
217; CHECK: class klass const &__cdecl operator>>(class klass const &, unsigned __int64)
218
219??2@YAPEAX_KAEAVklass@@@Z
220; CHECK: void *__cdecl operator new(unsigned __int64, class klass &)
221
222??_U@YAPEAX_KAEAVklass@@@Z
223; CHECK: void *__cdecl operator new[](unsigned __int64, class klass &)
224
225??3@YAXPEAXAEAVklass@@@Z
226; CHECK: void __cdecl operator delete(void *, class klass &)
227
228??_V@YAXPEAXAEAVklass@@@Z
229; CHECK: void __cdecl operator delete[](void *, class klass &)
230
231