1; These tests are based on clang/test/CodeGenCXX/mangle-ms.cpp 2; RUN: llvm-undname < %s | FileCheck %s 3 4; CHECK-NOT: Invalid mangled name 5 6?a@@3HA 7; CHECK: int a 8 9?b@N@@3HA 10; CHECK: int N::b 11 12?anonymous@?A@N@@3HA 13; CHECK: int N::`anonymous namespace'::anonymous 14 15; FIXME: Reference Temporaries 16; ?$RT1@NeedsReferenceTemporary@@3ABHB 17; ?$RT1@NeedsReferenceTemporary@@3AEBHEB 18 19?_c@@YAHXZ 20; CHECK: int __cdecl _c(void) 21 22?d@foo@@0FB 23; CHECK: static short const foo::d 24 25?e@foo@@1JC 26; CHECK: static long volatile foo::e 27 28?f@foo@@2DD 29; CHECK: static char const volatile foo::f 30 31??0foo@@QAE@XZ 32; CHECK: __thiscall foo::foo(void) 33 34??0foo@@QEAA@XZ 35; CHECK: __cdecl foo::foo(void) 36 37??1foo@@QAE@XZ 38; CHECK: __thiscall foo::~foo(void) 39 40??1foo@@QEAA@XZ 41; CHECK: __cdecl foo::~foo(void) 42 43??0foo@@QAE@H@Z 44; CHECK: __thiscall foo::foo(int) 45 46??0foo@@QEAA@H@Z 47; CHECK: __cdecl foo::foo(int) 48 49??0foo@@QAE@PAD@Z 50; CHECK: __thiscall foo::foo(char *) 51 52??0foo@@QEAA@PEAD@Z 53; CHECK: __cdecl foo::foo(char *) 54 55?bar@@YA?AVfoo@@XZ 56; CHECK: class foo __cdecl bar(void) 57 58?bar@@YA?AVfoo@@XZ 59; CHECK: class foo __cdecl bar(void) 60 61??Hfoo@@QAEHH@Z 62; CHECK: int __thiscall foo::operator+(int) 63 64??Hfoo@@QEAAHH@Z 65; CHECK: int __cdecl foo::operator+(int) 66 67?static_method@foo@@SAPAV1@XZ 68; CHECK: static class foo * __cdecl foo::static_method(void) 69 70?static_method@foo@@SAPEAV1@XZ 71; CHECK: static class foo * __cdecl foo::static_method(void) 72 73?g@bar@@2HA 74; CHECK: static int bar::g 75 76; undname returns `int *h1`, but it is a bug in their demangler. Their mangler 77; correctly mangles `int *h1` as ?h1@3PAHA and `int * const h1` as ?h1@3QAHA 78?h1@@3QAHA 79; CHECK: int *const h1 80 81?h2@@3QBHB 82; CHECK: int const *const h2 83 84?h3@@3QIAHIA 85; CHECK: int *const __restrict h3 86 87?h3@@3QEIAHEIA 88; CHECK: int *const __restrict h3 89 90?i@@3PAY0BE@HA 91; CHECK: int (*i)[20] 92 93?FunArr@@3PAY0BE@P6AHHH@ZA 94; CHECK: int (__cdecl *(*FunArr)[20])(int, int) 95 96?j@@3P6GHCE@ZA 97; CHECK: int (__stdcall *j)(signed char, unsigned char) 98 99?funptr@@YAP6AHXZXZ 100; CHECK: int (__cdecl * __cdecl funptr(void))(void) 101 102?k@@3PTfoo@@DT1@ 103; CHECK: char const volatile foo::*k 104 105?k@@3PETfoo@@DET1@ 106; CHECK: char const volatile foo::*k 107 108?l@@3P8foo@@AEHH@ZQ1@ 109; CHECK: int (__thiscall foo::*l)(int) 110 111?g_cInt@@3HB 112; CHECK: int const g_cInt 113 114?g_vInt@@3HC 115; CHECK: int volatile g_vInt 116 117?g_cvInt@@3HD 118; CHECK: int const volatile g_cvInt 119 120?beta@@YI_N_J_W@Z 121; CHECK: bool __fastcall beta(__int64, wchar_t) 122 123?beta@@YA_N_J_W@Z 124; CHECK: bool __cdecl beta(__int64, wchar_t) 125 126?alpha@@YGXMN@Z 127; CHECK: void __stdcall alpha(float, double) 128 129?alpha@@YAXMN@Z 130; CHECK: void __cdecl alpha(float, double) 131 132?gamma@@YAXVfoo@@Ubar@@Tbaz@@W4quux@@@Z 133; CHECK: void __cdecl gamma(class foo, struct bar, union baz, enum quux) 134 135?gamma@@YAXVfoo@@Ubar@@Tbaz@@W4quux@@@Z 136; CHECK: void __cdecl gamma(class foo, struct bar, union baz, enum quux) 137 138?delta@@YAXQAHABJ@Z 139; CHECK: void __cdecl delta(int *const, long const &) 140 141?delta@@YAXQEAHAEBJ@Z 142; CHECK: void __cdecl delta(int *const, long const &) 143 144?epsilon@@YAXQAY19BE@H@Z 145; CHECK: void __cdecl epsilon(int (*const)[10][20]) 146 147?epsilon@@YAXQEAY19BE@H@Z 148; CHECK: void __cdecl epsilon(int (*const)[10][20]) 149 150?zeta@@YAXP6AHHH@Z@Z 151; CHECK: void __cdecl zeta(int (__cdecl *)(int, int)) 152 153?zeta@@YAXP6AHHH@Z@Z 154; CHECK: void __cdecl zeta(int (__cdecl *)(int, int)) 155 156; FIXME: We don't support blocks yet. 157 158; ?eta@@YAXP_EAHHH@Z@Z 159; FIXME: void eta(int (^)(int, int)) 160; ?theta@@YAXP_EAHHH@Z@Z 161; FIXME: void theta(int(int,int)^ block) 162 163??2@YAPAXI@Z 164; CHECK: void * __cdecl operator new(unsigned int) 165 166??3@YAXPAX@Z 167; CHECK: void __cdecl operator delete(void *) 168 169??_U@YAPAXI@Z 170; CHECK: void * __cdecl operator new[](unsigned int) 171 172??_V@YAXPAX@Z 173; CHECK: void __cdecl operator delete[](void *) 174 175?color1@@3PANA 176; CHECK: double *color1 177 178?color2@@3QBNB 179; CHECK: double const *const color2 180 181; FIXME-EXTRACONST: These tests fails because we print an extra const inside the parens. 182; ?color3@@3QAY02$$CBNA 183; FIXME-EXTRACONST: double const (*color3)[3] 184 185; ?color4@@3QAY02$$CBNA 186; FIXME-EXTRACONST: double const (*color4)[3] 187 188?memptr1@@3RESB@@HES1@ 189; CHECK: int volatile B::*volatile memptr1 190 191?memptr2@@3PESB@@HES1@ 192; CHECK: int volatile B::*memptr2 193 194?memptr3@@3REQB@@HEQ1@ 195; CHECK: int B::*volatile memptr3 196 197?funmemptr1@@3RESB@@R6AHXZES1@ 198; CHECK: int (__cdecl *volatile B::*volatile funmemptr1)(void) 199 200?funmemptr2@@3PESB@@R6AHXZES1@ 201; CHECK: int (__cdecl *volatile B::*funmemptr2)(void) 202 203?funmemptr3@@3REQB@@P6AHXZEQ1@ 204; CHECK: int (__cdecl *B::*volatile funmemptr3)(void) 205 206?memptrtofun1@@3R8B@@EAAXXZEQ1@ 207; CHECK: void (__cdecl B::*volatile memptrtofun1)(void) 208 209?memptrtofun2@@3P8B@@EAAXXZEQ1@ 210; CHECK: void (__cdecl B::*memptrtofun2)(void) 211 212?memptrtofun3@@3P8B@@EAAXXZEQ1@ 213; CHECK: void (__cdecl B::*memptrtofun3)(void) 214 215?memptrtofun4@@3R8B@@EAAHXZEQ1@ 216; CHECK: int (__cdecl B::*volatile memptrtofun4)(void) 217 218?memptrtofun5@@3P8B@@EAA?CHXZEQ1@ 219; CHECK: int volatile (__cdecl B::*memptrtofun5)(void) 220 221?memptrtofun6@@3P8B@@EAA?BHXZEQ1@ 222; CHECK: int const (__cdecl B::*memptrtofun6)(void) 223 224?memptrtofun7@@3R8B@@EAAP6AHXZXZEQ1@ 225; CHECK: int (__cdecl * (__cdecl B::*volatile memptrtofun7)(void))(void) 226 227?memptrtofun8@@3P8B@@EAAR6AHXZXZEQ1@ 228; CHECK: int (__cdecl *volatile (__cdecl B::*memptrtofun8)(void))(void) 229 230?memptrtofun9@@3P8B@@EAAQ6AHXZXZEQ1@ 231; CHECK: int (__cdecl *const (__cdecl B::*memptrtofun9)(void))(void) 232 233 234?fooE@@YA?AW4E@@XZ 235; CHECK: enum E __cdecl fooE(void) 236 237?fooE@@YA?AW4E@@XZ 238; CHECK: enum E __cdecl fooE(void) 239 240?fooX@@YA?AVX@@XZ 241; CHECK: class X __cdecl fooX(void) 242 243?fooX@@YA?AVX@@XZ 244; CHECK: class X __cdecl fooX(void) 245 246?s0@PR13182@@3PADA 247; CHECK: char *PR13182::s0 248 249?s1@PR13182@@3PADA 250; CHECK: char *PR13182::s1 251 252?s2@PR13182@@3QBDB 253; CHECK: char const *const PR13182::s2 254 255?s3@PR13182@@3QBDB 256; CHECK: char const *const PR13182::s3 257 258?s4@PR13182@@3RCDC 259; CHECK: char volatile *volatile PR13182::s4 260 261?s5@PR13182@@3SDDD 262; CHECK: char const volatile *const volatile PR13182::s5 263 264; undname adds an extra const in here, but it seems like their bug. 265?s6@PR13182@@3PBQBDB 266; CHECK: char const *const *PR13182::s6 267 268; FIXME: We don't properly support extern "C" functions yet. 269; ?local@?1??extern_c_func@@9@4HA 270; FIXME: int `extern_c_func'::`2'::local 271 272; ?local@?1??extern_c_func@@9@4HA 273; FIXME: int `extern_c_func'::`2'::local 274 275?v@?1??f@@YAHXZ@4U<unnamed-type-v>@?1??1@YAHXZ@A 276; CHECK: struct `int __cdecl f(void)'::`2'::<unnamed-type-v> `int __cdecl f(void)'::`2'::v 277 278?v@?1???$f@H@@YAHXZ@4U<unnamed-type-v>@?1???$f@H@@YAHXZ@A 279; CHECK: struct `int __cdecl f<int>(void)'::`2'::<unnamed-type-v> `int __cdecl f<int>(void)'::`2'::v 280 281??2OverloadedNewDelete@@SAPAXI@Z 282; CHECK: static void * __cdecl OverloadedNewDelete::operator new(unsigned int) 283 284 285??_UOverloadedNewDelete@@SAPAXI@Z 286; CHECK: static void * __cdecl OverloadedNewDelete::operator new[](unsigned int) 287 288??3OverloadedNewDelete@@SAXPAX@Z 289; CHECK: static void __cdecl OverloadedNewDelete::operator delete(void *) 290 291 292??_VOverloadedNewDelete@@SAXPAX@Z 293; CHECK: static void __cdecl OverloadedNewDelete::operator delete[](void *) 294 295??HOverloadedNewDelete@@QAEHH@Z 296; CHECK: int __thiscall OverloadedNewDelete::operator+(int) 297 298??2OverloadedNewDelete@@SAPEAX_K@Z 299; CHECK: static void * __cdecl OverloadedNewDelete::operator new(unsigned __int64) 300 301??_UOverloadedNewDelete@@SAPEAX_K@Z 302; CHECK: static void * __cdecl OverloadedNewDelete::operator new[](unsigned __int64) 303 304??3OverloadedNewDelete@@SAXPEAX@Z 305; CHECK: static void __cdecl OverloadedNewDelete::operator delete(void *) 306 307 308??_VOverloadedNewDelete@@SAXPEAX@Z 309; CHECK: static void __cdecl OverloadedNewDelete::operator delete[](void *) 310 311??HOverloadedNewDelete@@QEAAHH@Z 312; CHECK: int __cdecl OverloadedNewDelete::operator+(int) 313 314 315??2TypedefNewDelete@@SAPAXI@Z 316; CHECK: static void * __cdecl TypedefNewDelete::operator new(unsigned int) 317 318 319??_UTypedefNewDelete@@SAPAXI@Z 320; CHECK: static void * __cdecl TypedefNewDelete::operator new[](unsigned int) 321 322??3TypedefNewDelete@@SAXPAX@Z 323; CHECK: static void __cdecl TypedefNewDelete::operator delete(void *) 324 325??_VTypedefNewDelete@@SAXPAX@Z 326; CHECK: static void __cdecl TypedefNewDelete::operator delete[](void *) 327 328?vector_func@@YQXXZ 329; CHECK: void __vectorcall vector_func(void) 330 331; FIXME: We don't support extern C funcs currently. 332; ??$fn_tmpl@$1?extern_c_func@@YAXXZ@@YAXXZ 333; FIXME: void __cdecl fn_tmpl<&void __cdecl extern_c_func(void)>(void) 334 335; ?overloaded_fn@@$$J0YAXXZ 336; FIXME-EXTERNC: extern \"C\" void __cdecl overloaded_fn(void) 337 338?f@UnnamedType@@YAXQAPAU<unnamed-type-T1>@S@1@@Z 339; CHECK: void __cdecl UnnamedType::f(struct UnnamedType::S::<unnamed-type-T1> **const) 340 341?f@UnnamedType@@YAXUT2@S@1@@Z 342; CHECK: void __cdecl UnnamedType::f(struct UnnamedType::S::T2) 343 344?f@UnnamedType@@YAXPAUT4@S@1@@Z 345; CHECK: void __cdecl UnnamedType::f(struct UnnamedType::S::T4 *) 346 347?f@UnnamedType@@YAXUT4@S@1@@Z 348; CHECK: void __cdecl UnnamedType::f(struct UnnamedType::S::T4) 349 350?f@UnnamedType@@YAXUT5@S@1@@Z 351; CHECK: void __cdecl UnnamedType::f(struct UnnamedType::S::T5) 352 353?f@UnnamedType@@YAXUT2@S@1@@Z 354; CHECK: void __cdecl UnnamedType::f(struct UnnamedType::S::T2) 355 356?f@UnnamedType@@YAXUT4@S@1@@Z 357; CHECK: void __cdecl UnnamedType::f(struct UnnamedType::S::T4) 358 359?f@UnnamedType@@YAXUT5@S@1@@Z 360; CHECK: void __cdecl UnnamedType::f(struct UnnamedType::S::T5) 361 362 363; ?foo@PassObjectSize@@YAHQAHW4__pass_object_size0@__clang@@@Z 364; FIXME: int foo(int *const i __attribute__((pass_object_size(0)))); 365; ?bar@PassObjectSize@@YAHQAHW4__pass_object_size1@__clang@@@Z 366; FIXME: int bar(int *const i __attribute__((pass_object_size(1)))); 367; ?qux@PassObjectSize@@YAHQAHW4__pass_object_size1@__clang@@0W4__pass_object_size0@3@@Z 368; FIXME: int qux(int *const i __attribute__((pass_object_size(1))), int *const j __attribute__((pass_object_size(0)))); 369; ?zot@PassObjectSize@@YAHQAHW4__pass_object_size1@__clang@@01@Z 370; FIXME: int zot(int *const i __attribute__((pass_object_size(1))), int *const j __attribute__((pass_object_size(1)))); 371 372 373 374?f@Atomic@@YAXU?$_Atomic@H@__clang@@@Z 375; CHECK: void __cdecl Atomic::f(struct __clang::_Atomic<int>) 376 377?f@Complex@@YAXU?$_Complex@H@__clang@@@Z 378; CHECK: void __cdecl Complex::f(struct __clang::_Complex<int>) 379 380?f@Float16@@YAXU_Float16@__clang@@@Z 381; CHECK: void __cdecl Float16::f(struct __clang::_Float16) 382 383 384??0?$L@H@NS@@QEAA@XZ 385; CHECK: __cdecl NS::L<int>::L<int>(void) 386 387??0Bar@Foo@@QEAA@XZ 388; CHECK: __cdecl Foo::Bar::Bar(void) 389 390??0?$L@V?$H@PAH@PR26029@@@PR26029@@QAE@XZ 391; CHECK: __thiscall PR26029::L<class PR26029::H<int *>>::L<class PR26029::H<int *>>(void) 392