1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-20 19:42:54 +02:00
llvm-mirror/test/Demangle/ms-mangle.test
Zachary Turner eb21f12ca7 [MS Demangler] Properly demangle templated operators.
After we detected the presence of a template via ?$ we would proceed by
only demangling a simple unqualified name. This means we would fail on
templated operators (and perhaps other yet-to-be-determined things)

This was discovered while doing some refactoring to store richer
semantic information about the demangled types to pave the way for
overhauling the way we handle backreferences. (Specifically, we need to
defer recording or resolving back-references until a symbol has been
completely demangled, because we need to use information that only
occurs later in the mangled string to decide whether a back-reference
should be recorded.)

Differential Revision: https://reviews.llvm.org/D50145

llvm-svn: 338608
2018-08-01 18:32:47 +00:00

395 lines
10 KiB
Plaintext

; 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)
??$?HH@S@@QEAAAEANH@Z
; CHECK: double & __cdecl S::operator+<int>(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)