| ; These tests are based on clang/test/CodeGenCXX/mangle-ms.cpp | |
| ; RUN: llvm-undname < %s | FileCheck %s | |
| ; CHECK-NOT: Invalid mangled name | |
| ?a@@3HA | |
| ; CHECK: int a | |
| ?b@N@@3HA | |
| ; CHECK: int N::b | |
| ?anonymous@?A@N@@3HA | |
| ; CHECK: int N::`anonymous namespace'::anonymous | |
| ; FIXME: Reference Temporaries | |
| ; ?$RT1@NeedsReferenceTemporary@@3ABHB | |
| ; ?$RT1@NeedsReferenceTemporary@@3AEBHEB | |
| ?_c@@YAHXZ | |
| ; CHECK: int __cdecl _c(void) | |
| ?d@foo@@0FB | |
| ; CHECK: static short const foo::d | |
| ?e@foo@@1JC | |
| ; CHECK: static long volatile foo::e | |
| ?f@foo@@2DD | |
| ; CHECK: static char const volatile foo::f | |
| ??0foo@@QAE@XZ | |
| ; CHECK: __thiscall foo::foo(void) | |
| ??0foo@@QEAA@XZ | |
| ; CHECK: __cdecl foo::foo(void) | |
| ??1foo@@QAE@XZ | |
| ; CHECK: __thiscall foo::~foo(void) | |
| ??1foo@@QEAA@XZ | |
| ; CHECK: __cdecl foo::~foo(void) | |
| ??0foo@@QAE@H@Z | |
| ; CHECK: __thiscall foo::foo(int) | |
| ??0foo@@QEAA@H@Z | |
| ; CHECK: __cdecl foo::foo(int) | |
| ??0foo@@QAE@PAD@Z | |
| ; CHECK: __thiscall foo::foo(char *) | |
| ??0foo@@QEAA@PEAD@Z | |
| ; CHECK: __cdecl foo::foo(char *) | |
| ?bar@@YA?AVfoo@@XZ | |
| ; CHECK: class foo __cdecl bar(void) | |
| ?bar@@YA?AVfoo@@XZ | |
| ; CHECK: class foo __cdecl bar(void) | |
| ??Hfoo@@QAEHH@Z | |
| ; CHECK: int __thiscall foo::operator+(int) | |
| ??Hfoo@@QEAAHH@Z | |
| ; CHECK: int __cdecl foo::operator+(int) | |
| ?static_method@foo@@SAPAV1@XZ | |
| ; CHECK: static class foo * __cdecl foo::static_method(void) | |
| ?static_method@foo@@SAPEAV1@XZ | |
| ; CHECK: static class foo * __cdecl foo::static_method(void) | |
| ?g@bar@@2HA | |
| ; CHECK: static int bar::g | |
| ; undname returns `int *h1`, but it is a bug in their demangler. Their mangler | |
| ; correctly mangles `int *h1` as ?h1@3PAHA and `int * const h1` as ?h1@3QAHA | |
| ?h1@@3QAHA | |
| ; CHECK: int *const h1 | |
| ?h2@@3QBHB | |
| ; CHECK: int const *const h2 | |
| ?h3@@3QIAHIA | |
| ; CHECK: int *const __restrict h3 | |
| ?h3@@3QEIAHEIA | |
| ; CHECK: int *const __restrict h3 | |
| ?i@@3PAY0BE@HA | |
| ; CHECK: int (*i)[20] | |
| ?FunArr@@3PAY0BE@P6AHHH@ZA | |
| ; CHECK: int (__cdecl *(*FunArr)[20])(int, int) | |
| ?j@@3P6GHCE@ZA | |
| ; CHECK: int (__stdcall *j)(signed char, unsigned char) | |
| ?funptr@@YAP6AHXZXZ | |
| ; CHECK: int (__cdecl * __cdecl funptr(void))(void) | |
| ?k@@3PTfoo@@DT1@ | |
| ; CHECK: char const volatile foo::*k | |
| ?k@@3PETfoo@@DET1@ | |
| ; CHECK: char const volatile foo::*k | |
| ?l@@3P8foo@@AEHH@ZQ1@ | |
| ; CHECK: int (__thiscall foo::*l)(int) | |
| ?g_cInt@@3HB | |
| ; CHECK: int const g_cInt | |
| ?g_vInt@@3HC | |
| ; CHECK: int volatile g_vInt | |
| ?g_cvInt@@3HD | |
| ; CHECK: int const volatile g_cvInt | |
| ?beta@@YI_N_J_W@Z | |
| ; CHECK: bool __fastcall beta(__int64, wchar_t) | |
| ?beta@@YA_N_J_W@Z | |
| ; CHECK: bool __cdecl beta(__int64, wchar_t) | |
| ?alpha@@YGXMN@Z | |
| ; CHECK: void __stdcall alpha(float, double) | |
| ?alpha@@YAXMN@Z | |
| ; CHECK: void __cdecl alpha(float, double) | |
| ?gamma@@YAXVfoo@@Ubar@@Tbaz@@W4quux@@@Z | |
| ; CHECK: void __cdecl gamma(class foo, struct bar, union baz, enum quux) | |
| ?gamma@@YAXVfoo@@Ubar@@Tbaz@@W4quux@@@Z | |
| ; CHECK: void __cdecl gamma(class foo, struct bar, union baz, enum quux) | |
| ?delta@@YAXQAHABJ@Z | |
| ; CHECK: void __cdecl delta(int *const, long const &) | |
| ?delta@@YAXQEAHAEBJ@Z | |
| ; CHECK: void __cdecl delta(int *const, long const &) | |
| ?epsilon@@YAXQAY19BE@H@Z | |
| ; CHECK: void __cdecl epsilon(int (*const)[10][20]) | |
| ?epsilon@@YAXQEAY19BE@H@Z | |
| ; CHECK: void __cdecl epsilon(int (*const)[10][20]) | |
| ?zeta@@YAXP6AHHH@Z@Z | |
| ; CHECK: void __cdecl zeta(int (__cdecl *)(int, int)) | |
| ?zeta@@YAXP6AHHH@Z@Z | |
| ; CHECK: void __cdecl zeta(int (__cdecl *)(int, int)) | |
| ; FIXME: We don't support blocks yet. | |
| ; ?eta@@YAXP_EAHHH@Z@Z | |
| ; FIXME: void eta(int (^)(int, int)) | |
| ; ?theta@@YAXP_EAHHH@Z@Z | |
| ; FIXME: void theta(int(int,int)^ block) | |
| ??2@YAPAXI@Z | |
| ; CHECK: void * __cdecl operator new(unsigned int) | |
| ??3@YAXPAX@Z | |
| ; CHECK: void __cdecl operator delete(void *) | |
| ??_U@YAPAXI@Z | |
| ; CHECK: void * __cdecl operator new[](unsigned int) | |
| ??_V@YAXPAX@Z | |
| ; CHECK: void __cdecl operator delete[](void *) | |
| ?color1@@3PANA | |
| ; CHECK: double *color1 | |
| ?color2@@3QBNB | |
| ; CHECK: double const *const color2 | |
| ; FIXME-EXTRACONST: These tests fails because we print an extra const inside the parens. | |
| ; ?color3@@3QAY02$$CBNA | |
| ; FIXME-EXTRACONST: double const (*color3)[3] | |
| ; ?color4@@3QAY02$$CBNA | |
| ; FIXME-EXTRACONST: double const (*color4)[3] | |
| ?memptr1@@3RESB@@HES1@ | |
| ; CHECK: int volatile B::*volatile memptr1 | |
| ?memptr2@@3PESB@@HES1@ | |
| ; CHECK: int volatile B::*memptr2 | |
| ?memptr3@@3REQB@@HEQ1@ | |
| ; CHECK: int B::*volatile memptr3 | |
| ?funmemptr1@@3RESB@@R6AHXZES1@ | |
| ; CHECK: int (__cdecl *volatile B::*volatile funmemptr1)(void) | |
| ?funmemptr2@@3PESB@@R6AHXZES1@ | |
| ; CHECK: int (__cdecl *volatile B::*funmemptr2)(void) | |
| ?funmemptr3@@3REQB@@P6AHXZEQ1@ | |
| ; CHECK: int (__cdecl *B::*volatile funmemptr3)(void) | |
| ?memptrtofun1@@3R8B@@EAAXXZEQ1@ | |
| ; CHECK: void (__cdecl B::*volatile memptrtofun1)(void) | |
| ?memptrtofun2@@3P8B@@EAAXXZEQ1@ | |
| ; CHECK: void (__cdecl B::*memptrtofun2)(void) | |
| ?memptrtofun3@@3P8B@@EAAXXZEQ1@ | |
| ; CHECK: void (__cdecl B::*memptrtofun3)(void) | |
| ?memptrtofun4@@3R8B@@EAAHXZEQ1@ | |
| ; CHECK: int (__cdecl B::*volatile memptrtofun4)(void) | |
| ?memptrtofun5@@3P8B@@EAA?CHXZEQ1@ | |
| ; CHECK: int volatile (__cdecl B::*memptrtofun5)(void) | |
| ?memptrtofun6@@3P8B@@EAA?BHXZEQ1@ | |
| ; CHECK: int const (__cdecl B::*memptrtofun6)(void) | |
| ?memptrtofun7@@3R8B@@EAAP6AHXZXZEQ1@ | |
| ; CHECK: int (__cdecl * (__cdecl B::*volatile memptrtofun7)(void))(void) | |
| ?memptrtofun8@@3P8B@@EAAR6AHXZXZEQ1@ | |
| ; CHECK: int (__cdecl *volatile (__cdecl B::*memptrtofun8)(void))(void) | |
| ?memptrtofun9@@3P8B@@EAAQ6AHXZXZEQ1@ | |
| ; CHECK: int (__cdecl *const (__cdecl B::*memptrtofun9)(void))(void) | |
| ?fooE@@YA?AW4E@@XZ | |
| ; CHECK: enum E __cdecl fooE(void) | |
| ?fooE@@YA?AW4E@@XZ | |
| ; CHECK: enum E __cdecl fooE(void) | |
| ?fooX@@YA?AVX@@XZ | |
| ; CHECK: class X __cdecl fooX(void) | |
| ?fooX@@YA?AVX@@XZ | |
| ; CHECK: class X __cdecl fooX(void) | |
| ?s0@PR13182@@3PADA | |
| ; CHECK: char *PR13182::s0 | |
| ?s1@PR13182@@3PADA | |
| ; CHECK: char *PR13182::s1 | |
| ?s2@PR13182@@3QBDB | |
| ; CHECK: char const *const PR13182::s2 | |
| ?s3@PR13182@@3QBDB | |
| ; CHECK: char const *const PR13182::s3 | |
| ?s4@PR13182@@3RCDC | |
| ; CHECK: char volatile *volatile PR13182::s4 | |
| ?s5@PR13182@@3SDDD | |
| ; CHECK: char const volatile *const volatile PR13182::s5 | |
| ; undname adds an extra const in here, but it seems like their bug. | |
| ?s6@PR13182@@3PBQBDB | |
| ; CHECK: char const *const *PR13182::s6 | |
| ; FIXME: We don't properly support extern "C" functions yet. | |
| ; ?local@?1??extern_c_func@@9@4HA | |
| ; FIXME: int `extern_c_func'::`2'::local | |
| ; ?local@?1??extern_c_func@@9@4HA | |
| ; FIXME: int `extern_c_func'::`2'::local | |
| ?v@?1??f@@YAHXZ@4U<unnamed-type-v>@?1??1@YAHXZ@A | |
| ; CHECK: struct `int __cdecl f(void)'::`2'::<unnamed-type-v> `int __cdecl f(void)'::`2'::v | |
| ?v@?1???$f@H@@YAHXZ@4U<unnamed-type-v>@?1???$f@H@@YAHXZ@A | |
| ; CHECK: struct `int __cdecl f<int>(void)'::`2'::<unnamed-type-v> `int __cdecl f<int>(void)'::`2'::v | |
| ??2OverloadedNewDelete@@SAPAXI@Z | |
| ; CHECK: static void * __cdecl OverloadedNewDelete::operator new(unsigned int) | |
| ??_UOverloadedNewDelete@@SAPAXI@Z | |
| ; CHECK: static void * __cdecl OverloadedNewDelete::operator new[](unsigned int) | |
| ??3OverloadedNewDelete@@SAXPAX@Z | |
| ; CHECK: static void __cdecl OverloadedNewDelete::operator delete(void *) | |
| ??_VOverloadedNewDelete@@SAXPAX@Z | |
| ; CHECK: static void __cdecl OverloadedNewDelete::operator delete[](void *) | |
| ??HOverloadedNewDelete@@QAEHH@Z | |
| ; CHECK: int __thiscall OverloadedNewDelete::operator+(int) | |
| ??2OverloadedNewDelete@@SAPEAX_K@Z | |
| ; CHECK: static void * __cdecl OverloadedNewDelete::operator new(unsigned __int64) | |
| ??_UOverloadedNewDelete@@SAPEAX_K@Z | |
| ; CHECK: static void * __cdecl OverloadedNewDelete::operator new[](unsigned __int64) | |
| ??3OverloadedNewDelete@@SAXPEAX@Z | |
| ; CHECK: static void __cdecl OverloadedNewDelete::operator delete(void *) | |
| ??_VOverloadedNewDelete@@SAXPEAX@Z | |
| ; CHECK: static void __cdecl OverloadedNewDelete::operator delete[](void *) | |
| ??HOverloadedNewDelete@@QEAAHH@Z | |
| ; CHECK: int __cdecl OverloadedNewDelete::operator+(int) | |
| ??2TypedefNewDelete@@SAPAXI@Z | |
| ; CHECK: static void * __cdecl TypedefNewDelete::operator new(unsigned int) | |
| ??_UTypedefNewDelete@@SAPAXI@Z | |
| ; CHECK: static void * __cdecl TypedefNewDelete::operator new[](unsigned int) | |
| ??3TypedefNewDelete@@SAXPAX@Z | |
| ; CHECK: static void __cdecl TypedefNewDelete::operator delete(void *) | |
| ??_VTypedefNewDelete@@SAXPAX@Z | |
| ; CHECK: static void __cdecl TypedefNewDelete::operator delete[](void *) | |
| ?vector_func@@YQXXZ | |
| ; CHECK: void __vectorcall vector_func(void) | |
| ; FIXME: We don't support extern C funcs currently. | |
| ; ??$fn_tmpl@$1?extern_c_func@@YAXXZ@@YAXXZ | |
| ; FIXME: void __cdecl fn_tmpl<&void __cdecl extern_c_func(void)>(void) | |
| ; ?overloaded_fn@@$$J0YAXXZ | |
| ; FIXME-EXTERNC: extern \"C\" void __cdecl overloaded_fn(void) | |
| ?f@UnnamedType@@YAXQAPAU<unnamed-type-T1>@S@1@@Z | |
| ; CHECK: void __cdecl UnnamedType::f(struct UnnamedType::S::<unnamed-type-T1> **const) | |
| ?f@UnnamedType@@YAXUT2@S@1@@Z | |
| ; CHECK: void __cdecl UnnamedType::f(struct UnnamedType::S::T2) | |
| ?f@UnnamedType@@YAXPAUT4@S@1@@Z | |
| ; CHECK: void __cdecl UnnamedType::f(struct UnnamedType::S::T4 *) | |
| ?f@UnnamedType@@YAXUT4@S@1@@Z | |
| ; CHECK: void __cdecl UnnamedType::f(struct UnnamedType::S::T4) | |
| ?f@UnnamedType@@YAXUT5@S@1@@Z | |
| ; CHECK: void __cdecl UnnamedType::f(struct UnnamedType::S::T5) | |
| ?f@UnnamedType@@YAXUT2@S@1@@Z | |
| ; CHECK: void __cdecl UnnamedType::f(struct UnnamedType::S::T2) | |
| ?f@UnnamedType@@YAXUT4@S@1@@Z | |
| ; CHECK: void __cdecl UnnamedType::f(struct UnnamedType::S::T4) | |
| ?f@UnnamedType@@YAXUT5@S@1@@Z | |
| ; CHECK: void __cdecl UnnamedType::f(struct UnnamedType::S::T5) | |
| ; ?foo@PassObjectSize@@YAHQAHW4__pass_object_size0@__clang@@@Z | |
| ; FIXME: int foo(int *const i __attribute__((pass_object_size(0)))); | |
| ; ?bar@PassObjectSize@@YAHQAHW4__pass_object_size1@__clang@@@Z | |
| ; FIXME: int bar(int *const i __attribute__((pass_object_size(1)))); | |
| ; ?qux@PassObjectSize@@YAHQAHW4__pass_object_size1@__clang@@0W4__pass_object_size0@3@@Z | |
| ; FIXME: int qux(int *const i __attribute__((pass_object_size(1))), int *const j __attribute__((pass_object_size(0)))); | |
| ; ?zot@PassObjectSize@@YAHQAHW4__pass_object_size1@__clang@@01@Z | |
| ; FIXME: int zot(int *const i __attribute__((pass_object_size(1))), int *const j __attribute__((pass_object_size(1)))); | |
| ?f@Atomic@@YAXU?$_Atomic@H@__clang@@@Z | |
| ; CHECK: void __cdecl Atomic::f(struct __clang::_Atomic<int>) | |
| ?f@Complex@@YAXU?$_Complex@H@__clang@@@Z | |
| ; CHECK: void __cdecl Complex::f(struct __clang::_Complex<int>) | |
| ?f@Float16@@YAXU_Float16@__clang@@@Z | |
| ; CHECK: void __cdecl Float16::f(struct __clang::_Float16) | |
| ??0?$L@H@NS@@QEAA@XZ | |
| ; CHECK: __cdecl NS::L<int>::L<int>(void) | |
| ??0Bar@Foo@@QEAA@XZ | |
| ; CHECK: __cdecl Foo::Bar::Bar(void) | |
| ??0?$L@V?$H@PAH@PR26029@@@PR26029@@QAE@XZ | |
| ; CHECK: __thiscall PR26029::L<class PR26029::H<int *>>::L<class PR26029::H<int *>>(void) |