| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // RUN: cxx_compiler cxx_11 -D_GLIBCXX_USE_CXX11_ABI=0 -c %s -o %t.o |
| // RUN: bindump %t.o | FileCheck -allow-deprecated-dag-overlap prefixes %s |
| |
| #include <cstddef> |
| |
| // CHECK-DAG: _Z8functionv |
| void function() {} |
| |
| // CHECK-DAG: _Z3fooi |
| void foo(int) {} |
| |
| extern "C" { |
| // CHECK-DAG: foo |
| void foo() {} |
| } |
| |
| // tests |
| // CHECK-DAG: _ZN16jksnurvbvlhvfkux26ltqskcbxhbqavdtthaorlirkvrER23evpowqhtpqlwphewbccruiwR23ruxsdsnmueaxeuyqizhdsel |
| struct evpowqhtpqlwphewbccruiw {}; |
| struct ruxsdsnmueaxeuyqizhdsel {}; |
| struct jksnurvbvlhvfkux { |
| void ltqskcbxhbqavdtthaorlirkvr(evpowqhtpqlwphewbccruiw &, |
| ruxsdsnmueaxeuyqizhdsel &); |
| }; |
| void jksnurvbvlhvfkux::ltqskcbxhbqavdtthaorlirkvr(evpowqhtpqlwphewbccruiw &, |
| ruxsdsnmueaxeuyqizhdsel &) {} |
| |
| // CHECK-DAG: _ZN8okldbcpoI7ubkozqz14smagsiclrkkqwcLj0E20alhmzoeengpqmwjfmjwgE8whnstwiy9bxllucksuERKNS3_16swsniwznpdhlkivsE |
| struct ubkozqz {}; |
| struct smagsiclrkkqwc {}; |
| struct alhmzoeengpqmwjfmjwg {}; |
| template <class T, class U, unsigned a, class W> struct okldbcpo { |
| struct swsniwznpdhlkivs {}; |
| struct whnstwiy { |
| void bxllucksu(okldbcpo<T, U, a, W>::swsniwznpdhlkivs const &); |
| }; |
| }; |
| |
| template <> |
| void okldbcpo<ubkozqz, smagsiclrkkqwc, 0u, alhmzoeengpqmwjfmjwg>::whnstwiy:: |
| bxllucksu(okldbcpo<ubkozqz, smagsiclrkkqwc, 0u, |
| alhmzoeengpqmwjfmjwg>::swsniwznpdhlkivs const &) {} |
| |
| // CHECK-DAG: _ZN5gznwyD1Ev |
| struct gznwy { |
| ~gznwy(); |
| }; |
| gznwy::~gznwy() {} |
| |
| // CHECK-DAG: _ZN15tuscbncxpqrqspjC1ERK8xsflodyeS2_b |
| struct xsflodye {}; |
| struct tuscbncxpqrqspj { |
| tuscbncxpqrqspj(xsflodye const &, xsflodye const &, bool); |
| }; |
| tuscbncxpqrqspj::tuscbncxpqrqspj(xsflodye const &, xsflodye const &, bool) {} |
| |
| // CHECK-DAG: _ZN5hyljqIPFvN10mnukufmczi19htmuvhnsicconebhkdhERK8xsflodyeS4_E18wmfnwhhdgcxowslpokE20lqklfjefhpcslvrofnutC1EiRKS7_ |
| struct mnukufmczi { |
| struct htmuvhnsicconebhkdh {}; |
| }; |
| struct wmfnwhhdgcxowslpok {}; |
| template <typename T, class C> struct hyljq { |
| struct lqklfjefhpcslvrofnut { |
| lqklfjefhpcslvrofnut(int, wmfnwhhdgcxowslpok const &); |
| }; |
| }; |
| |
| template <> |
| hyljq<void (*)(mnukufmczi::htmuvhnsicconebhkdh, xsflodye const &, |
| xsflodye const &), |
| wmfnwhhdgcxowslpok>::lqklfjefhpcslvrofnut:: |
| lqklfjefhpcslvrofnut(int, wmfnwhhdgcxowslpok const &) {} |
| |
| // CHECK-DAG: _Z9kqerssezlIN3gvu6zrjfkc14oqxicyfkugyisiE18mjwzznszyjtfpvksthEPT0_PT_ |
| struct loml {}; |
| struct mjwzznszyjtfpvksth {}; |
| struct gvu { |
| struct zrjfkc { |
| struct oqxicyfkugyisi {}; |
| }; |
| }; |
| template <class C, class D> D *kqerssezl(C *) {}; |
| template <> |
| mjwzznszyjtfpvksth *kqerssezl<gvu::zrjfkc::oqxicyfkugyisi, mjwzznszyjtfpvksth>( |
| gvu::zrjfkc::oqxicyfkugyisi *c) { |
| return 0; |
| } |
| |
| // CHECK-DAG: _ZNK10augyuwbszmI8cfhlachhEixEi |
| class cfhlachh {}; |
| template <class C> struct augyuwbszm { |
| void operator[](int) const; |
| }; |
| template <> void augyuwbszm<cfhlachh>::operator[](int) const {} |
| |
| // CHECK-DAG: _ZNK5tupbkIiEneERKS0_ |
| template <typename T> struct tupbk { |
| void operator!=(tupbk<T> const &) const; |
| }; |
| template <> void tupbk<int>::operator!=(tupbk<int> const &) const {} |
| |
| // CHECK-DAG: _ZN4iamy12saxordnzvdreE |
| namespace iamy { |
| int saxordnzvdre; |
| }; |
| |
| // CHECK-DAG: _Z1WiiiRK24frrjwvjhttlhsfrgvkqbnuuw |
| struct frrjwvjhttlhsfrgvkqbnuuw {}; |
| void W(int, int, int, frrjwvjhttlhsfrgvkqbnuuw const &) {} |
| |
| // CHECK-DAG: _ZN7wuytgnapLEt |
| struct wuytgna { |
| void operator+=(unsigned short); |
| }; |
| void wuytgna::operator+=(unsigned short) {} |
| |
| // CHECK-DAG: _ZlsR6byeldgRK11gdopbemiyor |
| struct byeldg {}; |
| struct gdopbemiyor {}; |
| void operator<<(byeldg &, gdopbemiyor const &) {} |
| |
| // CHECK-DAG: _ZrsR6byeldgRi |
| void operator>>(byeldg &, int &) {} |
| |
| // CHECK-DAG: _ZN5inssc6assertIbEEvT_ |
| struct inssc { |
| template <typename T> void assert(T); |
| }; |
| template <> void inssc::assert<bool>(bool) {} |
| |
| // CHECK-DAG: _Z9kqerssezlIP22grogpuwiutiwyiztgugzjkPvEPT0_PT_ |
| class grogpuwiutiwyiztgugzjk {}; |
| template <> |
| void **kqerssezl<grogpuwiutiwyiztgugzjk *, void *>(grogpuwiutiwyiztgugzjk **) { |
| return 0; |
| } |
| |
| // anonymous_namespaces |
| // skip as not specified by the ABI (and not important for linking) |
| |
| // special names |
| // CHECK-DAG: _ZTV4foo1 |
| class foo1 { |
| virtual void f(); |
| virtual ~foo1(); |
| }; |
| void foo1::f() {} |
| |
| // substitutions_work_in_base_36 |
| // CHECK-DAG: _Z3foo2s1S_2s2S0_2s3S1_2s4S2_2s5S3_2s6S4_2s7S5_2s8S6_2s9S7_3s10S8_3s11S9_3s12SA_3s13SB_3s14SC_3s15SD_3s16SE_3s17SF_3s18SG_3s19SH_3s20SI_3s21SJ_3s22SK_3s23SL_3s24SM_3s25SN_3s26SO_3s27SP_3s28SQ_3s29SR_3s30SS_3s31ST_3s32SU_3s33SV_3s34SW_3s35SX_3s36SY_3s37SZ_3s38S10_ |
| class s1 {}; |
| class s2 {}; |
| class s3 {}; |
| class s4 {}; |
| class s5 {}; |
| class s6 {}; |
| class s7 {}; |
| class s8 {}; |
| class s9 {}; |
| class s10 {}; |
| class s11 {}; |
| class s12 {}; |
| class s13 {}; |
| class s14 {}; |
| class s15 {}; |
| class s16 {}; |
| class s17 {}; |
| class s18 {}; |
| class s19 {}; |
| class s20 {}; |
| class s21 {}; |
| class s22 {}; |
| class s23 {}; |
| class s24 {}; |
| class s25 {}; |
| class s26 {}; |
| class s27 {}; |
| class s28 {}; |
| class s29 {}; |
| class s30 {}; |
| class s31 {}; |
| class s32 {}; |
| class s33 {}; |
| class s34 {}; |
| class s35 {}; |
| class s36 {}; |
| class s37 {}; |
| class s38 {}; |
| |
| void foo(s1, s1, s2, s2, s3, s3, s4, s4, s5, s5, s6, s6, s7, s7, s8, s8, s9, s9, |
| s10, s10, s11, s11, s12, s12, s13, s13, s14, s14, s15, s15, s16, s16, |
| s17, s17, s18, s18, s19, s19, s20, s20, s21, s21, s22, s22, s23, s23, |
| s24, s24, s25, s25, s26, s26, s27, s27, s28, s28, s29, s29, s30, s30, |
| s31, s31, s32, s32, s33, s33, s34, s34, s35, s35, s36, s36, s37, s37, |
| s38, s38) {} |
| |
| // substitutions |
| // CHECK-DAG: _ZSt3foov |
| namespace std { |
| void foo() {} |
| }; |
| |
| // CHECK-DAG: _Z3fooSaIcE |
| #include <string> |
| void foo(std::allocator<char>) {} |
| |
| // CHECK-DAG: _Z3fooSs |
| void |
| foo(std::basic_string<char, std::char_traits<char>, std::allocator<char> >) {} |
| |
| #include <iostream> |
| // CHECK-DAG: _Z3fooSi |
| void foo(std::basic_istream<char, std::char_traits<char> >) {} |
| |
| // CHECK-DAG: _Z3fooSo |
| void foo(std::basic_ostream<char, std::char_traits<char> >) {} |
| |
| // CHECK-DAG: _Z3fooSd |
| void foo(std::basic_iostream<char, std::char_traits<char> >) {} |
| |
| // CHECK-DAG: _Z1fa |
| void f(signed char) {} |
| |
| // CHECK-DAG: _Z1gai |
| void g(signed char, int) {} |
| |
| // CHECK-DAG: _Z1haa |
| void h(signed char, signed char) {} |
| |
| // CHECK-DAG: _Z1fs |
| void f(short) {} |
| |
| // CHECK-DAG: _Z1gsi |
| void g(short, int) {} |
| |
| // CHECK-DAG: _Z1hss |
| void h(short, short) {} |
| |
| class bar {}; |
| // CHECK-DAG: _ZN4foof3bazEMNS_3barEKFbvE |
| class foof { |
| class bar {}; |
| void baz(bool (foof::bar::*)() const); |
| }; |
| void foof::baz(bool (foof::bar::*)() const) {} |
| |
| // CHECK-DAG: _Z3fooPvPA4_A4_h |
| void foo(void *, unsigned char (*)[4][4]) {} |
| |
| // CHECK-DAG: _ZN4foogIXadL_Z4buraEEE3barEv |
| int bura; |
| template <int *C> class foog { |
| void bar(); |
| }; |
| template <> void foog<(&bura)>::bar() {} |
| |
| // CHECK-DAG: _ZN4foohILi3ELi7EE3qrdIcEEvRAplstPT_L_ZN4qkla10ydyxkgmnvsIiLi3EE5ckepsEE_i |
| namespace qkla { |
| template <typename, int n> struct ydyxkgmnvs { |
| static const int ckeps = n; |
| }; |
| }; |
| template <int, int> struct fooh { |
| template <typename T> |
| void qrd(int (&)[((sizeof(T *)) + qkla::ydyxkgmnvs<int, 3>::ckeps)]) {} |
| }; |
| template <> |
| template <> |
| void fooh<3, 7>::qrd<char>( |
| int (&)[((sizeof(char *)) + qkla::ydyxkgmnvs<int, 3>::ckeps)]) {} |
| |
| // CHECK-DAG: _ZN5snlqx11agvhrfxatlcILj32ELj79764919ELj4294967295ELj4294967295ELb1ELb1EE13bmfngddnzstfeEPKvS3_ |
| namespace snlqx { |
| template <unsigned, unsigned, unsigned, unsigned, bool, bool> |
| struct agvhrfxatlc { |
| void bmfngddnzstfe(void const *, void const *); |
| }; |
| }; |
| template <> |
| void snlqx::agvhrfxatlc<32u, 79764919u, 4294967295u, 4294967295u, true, |
| true>::bmfngddnzstfe(void const *, void const *) {} |
| |
| // CHECK-DAG: _Z4foojM3barb |
| void fooj(bool bar::*) {} |
| |
| // CHECK-DAG: _Z4fookIFvPK3barEEvv |
| template <typename T> void fook(); |
| template <> void fook<void(bar const *)>() {} |
| |
| // CHECK-DAG: _ZN4foolILi3ELi7EE4qrd2EPN5snlqx4cqiv4nerxINS2_8lctrvokgIiLl3ELl7ELl2147483647ELl2147483647ELl2147483647ELl2147483647ELl2147483647ELl2147483647ELl2147483647ELl2147483647ELl2147483647ELl2147483647ELl2147483647ELl2147483647ELl2147483647ELl2147483647ELl2147483647ELl2147483647ELl2147483647ELl2147483647EEEN4qkla4qjgcILi0EEENS2_4ecnwINS2_4kuezINS6_3uraILi1EEEEESC_NS6_4ngslESE_SE_EEEE |
| namespace qkla { |
| template <int I> struct ura {}; |
| template <int I> struct qjgc {}; |
| struct ngsl {}; |
| }; |
| namespace snlqx { |
| namespace cqiv { |
| template <typename T1, typename T2, typename T3> struct nerx {}; |
| template <typename, long, long, long, long, long, long, long, long, long, long, |
| long, long, long, long, long, long, long, long, long, long> |
| struct lctrvokg {}; |
| template <class C, class, class, class, class> struct ecnw {}; |
| template <class C> struct kuez {}; |
| }; |
| }; |
| template <int, int> struct fool { |
| void qrd2(snlqx::cqiv::nerx< |
| snlqx::cqiv::lctrvokg<int, 3l, 7l, 2147483647l, 2147483647l, 2147483647l, |
| 2147483647l, 2147483647l, 2147483647l, 2147483647l, |
| 2147483647l, 2147483647l, 2147483647l, 2147483647l, |
| 2147483647l, 2147483647l, 2147483647l, 2147483647l, |
| 2147483647l, 2147483647l, 2147483647l>, |
| qkla::qjgc<0>, |
| snlqx::cqiv::ecnw<snlqx::cqiv::kuez<qkla::ura<1> >, qkla::ura<1>, qkla::ngsl, |
| qkla::ngsl, qkla::ngsl> > *); |
| }; |
| template <> |
| void fool<3, 7>::qrd2(snlqx::cqiv::nerx< |
| snlqx::cqiv::lctrvokg<int, 3l, 7l, 2147483647l, 2147483647l, 2147483647l, |
| 2147483647l, 2147483647l, 2147483647l, 2147483647l, |
| 2147483647l, 2147483647l, 2147483647l, 2147483647l, |
| 2147483647l, 2147483647l, 2147483647l, 2147483647l, |
| 2147483647l, 2147483647l, 2147483647l>, |
| qkla::qjgc<0>, |
| snlqx::cqiv::ecnw<snlqx::cqiv::kuez<qkla::ura<1> >, qkla::ura<1>, qkla::ngsl, |
| qkla::ngsl, qkla::ngsl> > *) {} |
| |
| // CHECK-DAG: _Z4foomiPFicE |
| void foom(int, int(char)) {} |
| |
| // CHECK-DAG: _Z4fooniPFicE |
| void foon(int, int (*)(char)) {} |
| |
| // CHECK-DAG: _Z4foooiRFicE |
| void fooo(int, int (&)(char)) {} |
| |
| // CHECK-DAG: _Z4foopiOFicE |
| void foop(int, int (&&)(char)) {} |