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