mangle.cpp revision f28c687866aed1ed7b4b9ddf44a51673861236cf
1f28c687866aed1ed7b4b9ddf44a51673861236cfAnders Carlsson// RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 -fblocks | 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 {
1448257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson  const Debug& operator<< (unsigned a) const { return *this; }
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
1750ccdf8d62cba2ad730001f133b6cc4836c42da83Anders Carlssonstruct S {
1760ccdf8d62cba2ad730001f133b6cc4836c42da83Anders Carlsson  typedef int U;
1770ccdf8d62cba2ad730001f133b6cc4836c42da83Anders Carlsson};
1780ccdf8d62cba2ad730001f133b6cc4836c42da83Anders Carlsson
1790ccdf8d62cba2ad730001f133b6cc4836c42da83Anders Carlssontemplate <typename T> typename T::U ft6(const T&) { return 0; }
1800ccdf8d62cba2ad730001f133b6cc4836c42da83Anders Carlsson
1810ccdf8d62cba2ad730001f133b6cc4836c42da83Anders Carlsson// CHECK: @_Z3ft6I1SENT_1UERKS1_
1820ccdf8d62cba2ad730001f133b6cc4836c42da83Anders Carlssontemplate int ft6<S>(const S&);
18350755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlsson
18450755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlssontemplate<typename> struct __is_scalar {
18550755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlsson  enum { __value = 1 };
18650755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlsson};
18750755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlsson
18850755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlssontemplate<bool, typename> struct __enable_if { };
18950755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlsson
19050755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlssontemplate<typename T> struct __enable_if<true, T> {
19150755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlsson  typedef T __type;
19250755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlsson};
19350755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlsson
19450755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlsson// PR5063
19550755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlssontemplate<typename T> typename __enable_if<__is_scalar<T>::__value, void>::__type ft7() { }
19650755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlsson
19750755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlsson// CHECK: @_Z3ft7IiEN11__enable_ifIXsr11__is_scalarIT_E7__valueEvE6__typeEv
19850755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlssontemplate void ft7<int>();
19950755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlsson// CHECK: @_Z3ft7IPvEN11__enable_ifIXsr11__is_scalarIT_E7__valueEvE6__typeEv
20050755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlssontemplate void ft7<void*>();
201b217c1b9d2225521f4021984ad5a424784fa22bbAnders Carlsson
202b217c1b9d2225521f4021984ad5a424784fa22bbAnders Carlsson// PR5144
203b217c1b9d2225521f4021984ad5a424784fa22bbAnders Carlssonextern "C" {
204b217c1b9d2225521f4021984ad5a424784fa22bbAnders Carlssonvoid extern_f(void);
205b217c1b9d2225521f4021984ad5a424784fa22bbAnders Carlsson};
206b217c1b9d2225521f4021984ad5a424784fa22bbAnders Carlsson
207b217c1b9d2225521f4021984ad5a424784fa22bbAnders Carlsson// CHECK: @extern_f
208b217c1b9d2225521f4021984ad5a424784fa22bbAnders Carlssonvoid extern_f(void) { }
209b217c1b9d2225521f4021984ad5a424784fa22bbAnders Carlsson
210c4355b6883382b85cda3b7337587784dabf3450bAnders Carlssonstruct S7 {
2115c478cf2d54157062cd843737324e0d0df03a464Anders Carlsson  S7();
212c4355b6883382b85cda3b7337587784dabf3450bAnders Carlsson
2135c478cf2d54157062cd843737324e0d0df03a464Anders Carlsson  struct S { S(); };
214c4355b6883382b85cda3b7337587784dabf3450bAnders Carlsson  struct {
215c4355b6883382b85cda3b7337587784dabf3450bAnders Carlsson    S s;
216c4355b6883382b85cda3b7337587784dabf3450bAnders Carlsson  } a;
217c4355b6883382b85cda3b7337587784dabf3450bAnders Carlsson};
218c4355b6883382b85cda3b7337587784dabf3450bAnders Carlsson
219c4355b6883382b85cda3b7337587784dabf3450bAnders Carlsson// PR5139
220c4355b6883382b85cda3b7337587784dabf3450bAnders Carlsson// CHECK: @_ZN2S7C1Ev
221c4355b6883382b85cda3b7337587784dabf3450bAnders Carlsson// CHECK: @_ZN2S7C2Ev
222c4355b6883382b85cda3b7337587784dabf3450bAnders Carlsson// CHECK: @"_ZN2S73$_0C1Ev"
223c4355b6883382b85cda3b7337587784dabf3450bAnders CarlssonS7::S7() {}
224c4355b6883382b85cda3b7337587784dabf3450bAnders Carlsson
225a7694087e4abaea261918ffbb3ffe38feb1da489Anders Carlsson// PR5063
226a7694087e4abaea261918ffbb3ffe38feb1da489Anders Carlssontemplate<typename T> typename __enable_if<(__is_scalar<T>::__value), void>::__type ft8() { }
227a7694087e4abaea261918ffbb3ffe38feb1da489Anders Carlsson// CHECK: @_Z3ft8IiEN11__enable_ifIXsr11__is_scalarIT_E7__valueEvE6__typeEv
228a7694087e4abaea261918ffbb3ffe38feb1da489Anders Carlssontemplate void ft8<int>();
229a7694087e4abaea261918ffbb3ffe38feb1da489Anders Carlsson// CHECK: @_Z3ft8IPvEN11__enable_ifIXsr11__is_scalarIT_E7__valueEvE6__typeEv
230a7694087e4abaea261918ffbb3ffe38feb1da489Anders Carlssontemplate void ft8<void*>();
231e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson
23258040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlsson// PR5796
23358040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlssonnamespace PR5796 {
23458040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlssontemplate<typename> struct __is_scalar {
23558040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlsson  enum { __value = 0 };
23658040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlsson};
23758040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlsson
23858040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlssontemplate<bool, typename> struct __enable_if {};
23958040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlssontemplate<typename T> struct __enable_if<true, T> { typedef T __type; };
24058040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlssontemplate<typename T>
24158040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlsson
24258040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlsson// CHECK: define linkonce_odr void @_ZN6PR57968__fill_aIiEENS_11__enable_ifIXntsrNS_11__is_scalarIT_EE7__valueEvE6__typeEv
24358040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlssontypename __enable_if<!__is_scalar<T>::__value, void>::__type __fill_a() { };
24458040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlsson
24558040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlssonvoid f() { __fill_a<int>(); }
24658040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlsson}
24758040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlsson
248e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlssonnamespace Expressions {
249e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson// Unary operators.
250e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson
251e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson// CHECK: define void @_ZN11Expressions2f1ILi1EEEvPAplngT_Li2E_i
252e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlssontemplate <int i> void f1(int (*)[(-i) + 2]) { };
253e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlssontemplate void f1<1>(int (*)[1]);
254e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson
255e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson// CHECK: define void @_ZN11Expressions2f2ILi1EEEvPApsT__i
256e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlssontemplate <int i> void f2(int (*)[+i]) { };
257e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlssontemplate void f2<1>(int (*)[1]);
258e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson
259e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson// Binary operators.
260e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson
261e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson// CHECK: define void @_ZN11Expressions2f3ILi1EEEvPAplT_T__i
262e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlssontemplate <int i> void f3(int (*)[i+i]) { };
263e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlssontemplate void f3<1>(int (*)[2]);
264e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson
265e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson// CHECK: define void @_ZN11Expressions2f4ILi1EEEvPAplplLi2ET_T__i
266e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlssontemplate <int i> void f4(int (*)[2 + i+i]) { };
267e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlssontemplate void f4<1>(int (*)[4]);
268e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson
269e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson// The ternary operator.
270e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson// CHECK: define void @_ZN11Expressions2f4ILb1EEEvPAquT_Li1ELi2E_i
271e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlssontemplate <bool b> void f4(int (*)[b ? 1 : 2]) { };
272e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlssontemplate void f4<true>(int (*)[1]);
273e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson}
2748257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson
2758257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlssonstruct Ops {
2768257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson  Ops& operator+(const Ops&);
2778257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson  Ops& operator-(const Ops&);
2788257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson  Ops& operator&(const Ops&);
2798257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson  Ops& operator*(const Ops&);
2808257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson
2818257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson  void *v;
2828257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson};
2838257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson
2848257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson// CHECK: define %struct.Ops* @_ZN3OpsplERKS_
2858257d411a759b91921681c3b7f79e50e0d9252dbAnders CarlssonOps& Ops::operator+(const Ops&) { return *this; }
2868257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson// CHECK: define %struct.Ops* @_ZN3OpsmiERKS_
2878257d411a759b91921681c3b7f79e50e0d9252dbAnders CarlssonOps& Ops::operator-(const Ops&) { return *this; }
2888257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson// CHECK: define %struct.Ops* @_ZN3OpsanERKS_
2898257d411a759b91921681c3b7f79e50e0d9252dbAnders CarlssonOps& Ops::operator&(const Ops&) { return *this; }
2908257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson// CHECK: define %struct.Ops* @_ZN3OpsmlERKS_
2918257d411a759b91921681c3b7f79e50e0d9252dbAnders CarlssonOps& Ops::operator*(const Ops&) { return *this; }
2928257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson
2939e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlsson// PR5861
2949e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlssonnamespace PR5861 {
2959e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlssontemplate<bool> class P;
2969e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlssontemplate<> class P<true> {};
2979e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlsson
2989e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlssontemplate<template <bool> class, bool>
2999e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlssonstruct Policy { };
3009e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlsson
3019e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlssontemplate<typename T, typename = Policy<P, true> > class Alloc
3029e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlsson{
3039e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlsson  T *allocate(int, const void*) { return 0; }
3049e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlsson};
3059e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlsson
3069e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlsson// CHECK: define i8* @_ZN6PR58615AllocIcNS_6PolicyINS_1PELb1EEEE8allocateEiPKv
3079e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlssontemplate class Alloc<char>;
3089e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlsson}
309f28c687866aed1ed7b4b9ddf44a51673861236cfAnders Carlsson
310f28c687866aed1ed7b4b9ddf44a51673861236cfAnders Carlsson// CHECK: define void @_Z1fU13block_pointerFiiiE
311f28c687866aed1ed7b4b9ddf44a51673861236cfAnders Carlssonvoid f(int (^)(int, int)) { }