mangle.cpp revision aeb85374e92619b8e4ce92ac6e30756b5053a137
19234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// RUN: clang-cc -emit-llvm %s -o - -triple=x86_64-apple-darwin9 | FileCheck %s 25f2bfd4811996abb783aa6c7254c56baa6930e8cDouglas Gregor 35f2bfd4811996abb783aa6c7254c56baa6930e8cDouglas Gregorstruct X { }; 45f2bfd4811996abb783aa6c7254c56baa6930e8cDouglas Gregorstruct Y { }; 5b1d947b1011cb559be5745153f292b2dfb46b8e6Anders Carlsson 69234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: @unmangled_variable = global 79234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: @_ZN1N1iE = global 89234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: @_ZZN1N1fEiiE1b = internal global 99234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: @_ZZN1N1gEvE1a = internal global 109234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: @_ZGVZN1N1gEvE1a = internal global 119234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson 129234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define zeroext i1 @_ZplRK1YRA100_P1X 135f2bfd4811996abb783aa6c7254c56baa6930e8cDouglas Gregorbool operator+(const Y&, X* (&xs)[100]) { return false; } 145f2bfd4811996abb783aa6c7254c56baa6930e8cDouglas Gregor 159234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_Z1f1s 16b1d947b1011cb559be5745153f292b2dfb46b8e6Anders Carlssontypedef struct { int a; } s; 17b1d947b1011cb559be5745153f292b2dfb46b8e6Anders Carlssonvoid f(s) { } 18b1d947b1011cb559be5745153f292b2dfb46b8e6Anders Carlsson 199234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_Z1f1e 20b1d947b1011cb559be5745153f292b2dfb46b8e6Anders Carlssontypedef enum { foo } e; 21b1d947b1011cb559be5745153f292b2dfb46b8e6Anders Carlssonvoid f(e) { } 22b1d947b1011cb559be5745153f292b2dfb46b8e6Anders Carlsson 239234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_Z1f1u 24b1d947b1011cb559be5745153f292b2dfb46b8e6Anders Carlssontypedef union { int a; } u; 25b1d947b1011cb559be5745153f292b2dfb46b8e6Anders Carlssonvoid f(u) { } 264843e584b54460973b8445d38907bab0401ebb0cAnders Carlsson 279234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_Z1f1x 284843e584b54460973b8445d38907bab0401ebb0cAnders Carlssontypedef struct { int a; } x,y; 294843e584b54460973b8445d38907bab0401ebb0cAnders Carlssonvoid f(y) { } 304843e584b54460973b8445d38907bab0401ebb0cAnders Carlsson 319234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_Z1fv 32c6c91bc019ff7fa09f6570025ba011aad4c0d004Anders Carlssonvoid f() { } 33984e06874685396ca2cb51f0008cfff7c9b3d9c6Anders Carlsson 349234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_ZN1N1fEv 35984e06874685396ca2cb51f0008cfff7c9b3d9c6Anders Carlssonnamespace N { void f() { } } 36984e06874685396ca2cb51f0008cfff7c9b3d9c6Anders Carlsson 379234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_ZN1N1N1fEv 38984e06874685396ca2cb51f0008cfff7c9b3d9c6Anders Carlssonnamespace N { namespace N { void f() { } } } 3991e20dd8bf1bc8980ee93839383d2bd170bce050Anders Carlsson 409234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @unmangled_function 4191e20dd8bf1bc8980ee93839383d2bd170bce050Anders Carlssonextern "C" { namespace N { void unmangled_function() { } } } 4291e20dd8bf1bc8980ee93839383d2bd170bce050Anders Carlsson 432928c2107f2e0007f35fe1c224aab63535f1403dAnders Carlssonextern "C" { namespace N { int unmangled_variable = 10; } } 4491e20dd8bf1bc8980ee93839383d2bd170bce050Anders Carlsson 45329749c1ec1ead3c41af52260f1203e4991b4e83Anders Carlssonnamespace N { int i; } 461b42c794481f6f958267e4ba913d74fef43161f6Anders Carlsson 471b42c794481f6f958267e4ba913d74fef43161f6Anders Carlssonnamespace N { int f(int, int) { static int b; return b; } } 48283a062a633d6e868aa2be319da812341fe73728Anders Carlsson 49283a062a633d6e868aa2be319da812341fe73728Anders Carlssonnamespace N { int h(); void g() { static int a = h(); } } 502df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner 519234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_Z1fno 522df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattnervoid f(__int128_t, __uint128_t) { } 537a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlsson 547a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlssontemplate <typename T> struct S1 {}; 557a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlsson 569234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_Z1f2S1IiE 577a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlssonvoid f(S1<int>) {} 587a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlsson 599234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_Z1f2S1IdE 607a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlssonvoid f(S1<double>) {} 617a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlsson 627a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlssontemplate <int N> struct S2 {}; 639234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_Z1f2S2ILi100EE 647a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlssonvoid f(S2<100>) {} 657a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlsson 669234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_Z1f2S2ILin100EE 677a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlssonvoid f(S2<-100>) {} 687a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlsson 697a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlssontemplate <bool B> struct S3 {}; 707a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlsson 719234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_Z1f2S3ILb1EE 727a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlssonvoid f(S3<true>) {} 737a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlsson 749234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_Z1f2S3ILb0EE 757a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlssonvoid f(S3<false>) {} 767a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlsson 779234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_Z2f22S3ILb1EE 787a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlssonvoid f2(S3<100>) {} 790e650017acdbbeb0c590e77bbea88c200ea1caefAnders Carlsson 800e650017acdbbeb0c590e77bbea88c200ea1caefAnders Carlssonstruct S; 810e650017acdbbeb0c590e77bbea88c200ea1caefAnders Carlsson 829234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_Z1fM1SKFvvE 830e650017acdbbeb0c590e77bbea88c200ea1caefAnders Carlssonvoid f(void (S::*)() const) {} 840e650017acdbbeb0c590e77bbea88c200ea1caefAnders Carlsson 859234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_Z1fM1SFvvE 860e650017acdbbeb0c590e77bbea88c200ea1caefAnders Carlssonvoid f(void (S::*)()) {} 87cf85b933fef4ce827df83ef2d22c322ab2078aa5Anders Carlsson 889234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_Z1fi 89cf85b933fef4ce827df83ef2d22c322ab2078aa5Anders Carlssonvoid f(const int) { } 90cf85b933fef4ce827df83ef2d22c322ab2078aa5Anders Carlsson 9103c9d530dbdcbb00b0b1ac0abced5dcce2e21408Anders Carlssontemplate<typename T, typename U> void ft1(U u, T t) { } 9203c9d530dbdcbb00b0b1ac0abced5dcce2e21408Anders Carlsson 9303c9d530dbdcbb00b0b1ac0abced5dcce2e21408Anders Carlssontemplate<typename T> void ft2(T t, void (*)(T), void (*)(T)) { } 949234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson 957624f219388f2434a4988ba2508a6ca7b57ba1c3Anders Carlssontemplate<typename T, typename U = S1<T> > struct S4 { }; 967624f219388f2434a4988ba2508a6ca7b57ba1c3Anders Carlssontemplate<typename T> void ft3(S4<T>*) { } 977624f219388f2434a4988ba2508a6ca7b57ba1c3Anders Carlsson 987482e247163978792654ca1a99913e19dd507e0aAnders Carlssonnamespace NS { 997482e247163978792654ca1a99913e19dd507e0aAnders Carlsson template<typename T> void ft1(T) { } 1007624f219388f2434a4988ba2508a6ca7b57ba1c3Anders Carlsson} 1017624f219388f2434a4988ba2508a6ca7b57ba1c3Anders Carlsson 102d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlssonvoid g1() { 10303c9d530dbdcbb00b0b1ac0abced5dcce2e21408Anders Carlsson // CHECK: @_Z3ft1IidEvT0_T_ 10403c9d530dbdcbb00b0b1ac0abced5dcce2e21408Anders Carlsson ft1<int, double>(1, 0); 10503c9d530dbdcbb00b0b1ac0abced5dcce2e21408Anders Carlsson 10603c9d530dbdcbb00b0b1ac0abced5dcce2e21408Anders Carlsson // CHECK: @_Z3ft2IcEvT_PFvS0_ES2_ 10703c9d530dbdcbb00b0b1ac0abced5dcce2e21408Anders Carlsson ft2<char>(1, 0, 0); 1087624f219388f2434a4988ba2508a6ca7b57ba1c3Anders Carlsson 1097624f219388f2434a4988ba2508a6ca7b57ba1c3Anders Carlsson // CHECK: @_Z3ft3IiEvP2S4IT_2S1IS1_EE 1107624f219388f2434a4988ba2508a6ca7b57ba1c3Anders Carlsson ft3<int>(0); 1117482e247163978792654ca1a99913e19dd507e0aAnders Carlsson 1127482e247163978792654ca1a99913e19dd507e0aAnders Carlsson // CHECK: @_ZN2NS3ft1IiEEvT_ 1137482e247163978792654ca1a99913e19dd507e0aAnders Carlsson NS::ft1<int>(1); 1147482e247163978792654ca1a99913e19dd507e0aAnders Carlsson} 1157482e247163978792654ca1a99913e19dd507e0aAnders Carlsson 116d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlsson// Expressions 117d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlssontemplate<int I> struct S5 { }; 118d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlsson 119d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlssontemplate<int I> void ft4(S5<I>) { } 120d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlssonvoid g2() { 121d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlsson // CHECK: @_Z3ft4ILi10EEv2S5IXT_EE 122d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlsson ft4(S5<10>()); 123d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlsson 124d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlsson // CHECK: @_Z3ft4ILi20EEv2S5IXT_EE 125d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlsson ft4(S5<20>()); 126d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlsson} 127d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlsson 1287482e247163978792654ca1a99913e19dd507e0aAnders Carlssonextern "C++" { 1297482e247163978792654ca1a99913e19dd507e0aAnders Carlsson // CHECK: @_Z1hv 1307482e247163978792654ca1a99913e19dd507e0aAnders Carlsson void h() { } 131d58d6f778de936516d8815783f2e88348c41dce4Anders Carlsson} 1327482e247163978792654ca1a99913e19dd507e0aAnders Carlsson 1335cc58c6cfe4a6378287dbf92f9b1a23e133a6118Anders Carlsson// PR5019 1345cc58c6cfe4a6378287dbf92f9b1a23e133a6118Anders Carlssonextern "C" { struct a { int b; }; } 1355cc58c6cfe4a6378287dbf92f9b1a23e133a6118Anders Carlsson 1365cc58c6cfe4a6378287dbf92f9b1a23e133a6118Anders Carlsson// CHECK: @_Z1fP1a 1375cc58c6cfe4a6378287dbf92f9b1a23e133a6118Anders Carlssonint f(struct a *x) { 1385cc58c6cfe4a6378287dbf92f9b1a23e133a6118Anders Carlsson return x->b; 1395cc58c6cfe4a6378287dbf92f9b1a23e133a6118Anders Carlsson} 140add28829c7a8d3c5da9ae140f18d3c9ad2d8b599Anders Carlsson 141add28829c7a8d3c5da9ae140f18d3c9ad2d8b599Anders Carlsson// PR5017 142add28829c7a8d3c5da9ae140f18d3c9ad2d8b599Anders Carlssonextern "C" { 143add28829c7a8d3c5da9ae140f18d3c9ad2d8b599Anders Carlssonstruct Debug { 144add28829c7a8d3c5da9ae140f18d3c9ad2d8b599Anders Carlsson const Debug& operator<< (unsigned a) const { } 145add28829c7a8d3c5da9ae140f18d3c9ad2d8b599Anders Carlsson}; 146add28829c7a8d3c5da9ae140f18d3c9ad2d8b599Anders CarlssonDebug dbg; 147add28829c7a8d3c5da9ae140f18d3c9ad2d8b599Anders Carlsson// CHECK: @_ZNK5DebuglsEj 148add28829c7a8d3c5da9ae140f18d3c9ad2d8b599Anders Carlssonint main(void) { dbg << 32 ;} 149add28829c7a8d3c5da9ae140f18d3c9ad2d8b599Anders Carlsson} 150ae3524866124021f3bc695886668254093c0793fAnders Carlsson 151ae3524866124021f3bc695886668254093c0793fAnders Carlssontemplate<typename T> struct S6 { 152ae3524866124021f3bc695886668254093c0793fAnders Carlsson typedef int B; 153ae3524866124021f3bc695886668254093c0793fAnders Carlsson}; 154ae3524866124021f3bc695886668254093c0793fAnders Carlsson 155ae3524866124021f3bc695886668254093c0793fAnders Carlssontemplate<typename T> void ft5(typename S6<T>::B) { } 156ae3524866124021f3bc695886668254093c0793fAnders Carlsson// CHECK: @_Z3ft5IiEvN2S6IT_E1BE 157ae3524866124021f3bc695886668254093c0793fAnders Carlssontemplate void ft5<int>(int); 1581668f2062b237ddb137f5d16388b3dea49651f85Anders Carlsson 1591668f2062b237ddb137f5d16388b3dea49651f85Anders Carlssontemplate<typename T> class A {}; 1601668f2062b237ddb137f5d16388b3dea49651f85Anders Carlsson 1611668f2062b237ddb137f5d16388b3dea49651f85Anders Carlssonnamespace NS { 1621668f2062b237ddb137f5d16388b3dea49651f85Anders Carlssontemplate<typename T> bool operator==(const A<T>&, const A<T>&) { return true; } 1631668f2062b237ddb137f5d16388b3dea49651f85Anders Carlsson} 1641668f2062b237ddb137f5d16388b3dea49651f85Anders Carlsson 165aeb85374e92619b8e4ce92ac6e30756b5053a137Anders Carlsson// CHECK: @_ZN2NSeqIcEEbRK1AIT_ES5_ 1661668f2062b237ddb137f5d16388b3dea49651f85Anders Carlssontemplate bool NS::operator==(const ::A<char>&, const ::A<char>&); 1671668f2062b237ddb137f5d16388b3dea49651f85Anders Carlsson 1681668f2062b237ddb137f5d16388b3dea49651f85Anders Carlssonnamespace std { 1691668f2062b237ddb137f5d16388b3dea49651f85Anders Carlssontemplate<typename T> bool operator==(const A<T>&, const A<T>&) { return true; } 1701668f2062b237ddb137f5d16388b3dea49651f85Anders Carlsson} 1711668f2062b237ddb137f5d16388b3dea49651f85Anders Carlsson 1721668f2062b237ddb137f5d16388b3dea49651f85Anders Carlsson// CHECK: @_ZSteqIcEbRK1AIT_ES4_ 1731668f2062b237ddb137f5d16388b3dea49651f85Anders Carlssontemplate bool std::operator==(const ::A<char>&, const ::A<char>&); 1741668f2062b237ddb137f5d16388b3dea49651f85Anders Carlsson 175