Home | History | Annotate | Download | only in Demangle
      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