mangle.cpp revision e292368afa63337f5ff64c967857a898d6f868da
1ad5e73887052193afda72db8efcb812bd083a4a8John McCall// RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 -fblocks -std=c++0x | FileCheck %s
25f2bfd4811996abb783aa6c7254c56baa6930e8cDouglas Gregorstruct X { };
35f2bfd4811996abb783aa6c7254c56baa6930e8cDouglas Gregorstruct Y { };
4b1d947b1011cb559be5745153f292b2dfb46b8e6Anders Carlsson
59234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: @unmangled_variable = global
69234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: @_ZN1N1iE = global
79234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: @_ZZN1N1fEiiE1b = internal global
89234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: @_ZZN1N1gEvE1a = internal global
99234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: @_ZGVZN1N1gEvE1a = internal global
109234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson
1131455256ae26cc7069111643ec4429ea564377daSean Hunt//CHECK: @pr5966_i = external global
1231455256ae26cc7069111643ec4429ea564377daSean Hunt//CHECK: @_ZL8pr5966_i = internal global
1331455256ae26cc7069111643ec4429ea564377daSean Hunt
149234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define zeroext i1 @_ZplRK1YRA100_P1X
155f2bfd4811996abb783aa6c7254c56baa6930e8cDouglas Gregorbool operator+(const Y&, X* (&xs)[100]) { return false; }
165f2bfd4811996abb783aa6c7254c56baa6930e8cDouglas Gregor
179234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_Z1f1s
18b1d947b1011cb559be5745153f292b2dfb46b8e6Anders Carlssontypedef struct { int a; } s;
19b1d947b1011cb559be5745153f292b2dfb46b8e6Anders Carlssonvoid f(s) { }
20b1d947b1011cb559be5745153f292b2dfb46b8e6Anders Carlsson
219234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_Z1f1e
22b1d947b1011cb559be5745153f292b2dfb46b8e6Anders Carlssontypedef enum { foo } e;
23b1d947b1011cb559be5745153f292b2dfb46b8e6Anders Carlssonvoid f(e) { }
24b1d947b1011cb559be5745153f292b2dfb46b8e6Anders Carlsson
259234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_Z1f1u
26b1d947b1011cb559be5745153f292b2dfb46b8e6Anders Carlssontypedef union { int a; } u;
27b1d947b1011cb559be5745153f292b2dfb46b8e6Anders Carlssonvoid f(u) { }
284843e584b54460973b8445d38907bab0401ebb0cAnders Carlsson
299234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_Z1f1x
304843e584b54460973b8445d38907bab0401ebb0cAnders Carlssontypedef struct { int a; } x,y;
314843e584b54460973b8445d38907bab0401ebb0cAnders Carlssonvoid f(y) { }
324843e584b54460973b8445d38907bab0401ebb0cAnders Carlsson
339234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_Z1fv
34c6c91bc019ff7fa09f6570025ba011aad4c0d004Anders Carlssonvoid f() { }
35984e06874685396ca2cb51f0008cfff7c9b3d9c6Anders Carlsson
369234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_ZN1N1fEv
37984e06874685396ca2cb51f0008cfff7c9b3d9c6Anders Carlssonnamespace N { void f() { } }
38984e06874685396ca2cb51f0008cfff7c9b3d9c6Anders Carlsson
399234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_ZN1N1N1fEv
40984e06874685396ca2cb51f0008cfff7c9b3d9c6Anders Carlssonnamespace N { namespace N { void f() { } } }
4191e20dd8bf1bc8980ee93839383d2bd170bce050Anders Carlsson
429234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @unmangled_function
4391e20dd8bf1bc8980ee93839383d2bd170bce050Anders Carlssonextern "C" { namespace N { void unmangled_function() { } } }
4491e20dd8bf1bc8980ee93839383d2bd170bce050Anders Carlsson
452928c2107f2e0007f35fe1c224aab63535f1403dAnders Carlssonextern "C" { namespace N { int unmangled_variable = 10; } }
4691e20dd8bf1bc8980ee93839383d2bd170bce050Anders Carlsson
47329749c1ec1ead3c41af52260f1203e4991b4e83Anders Carlssonnamespace N { int i; }
481b42c794481f6f958267e4ba913d74fef43161f6Anders Carlsson
491b42c794481f6f958267e4ba913d74fef43161f6Anders Carlssonnamespace N { int f(int, int) { static int b; return b; } }
50283a062a633d6e868aa2be319da812341fe73728Anders Carlsson
51283a062a633d6e868aa2be319da812341fe73728Anders Carlssonnamespace N { int h(); void g() { static int a = h(); } }
522df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner
539234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_Z1fno
542df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattnervoid f(__int128_t, __uint128_t) { }
557a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlsson
567a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlssontemplate <typename T> struct S1 {};
577a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlsson
589234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_Z1f2S1IiE
597a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlssonvoid f(S1<int>) {}
607a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlsson
619234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_Z1f2S1IdE
627a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlssonvoid f(S1<double>) {}
637a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlsson
647a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlssontemplate <int N> struct S2 {};
659234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_Z1f2S2ILi100EE
667a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlssonvoid f(S2<100>) {}
677a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlsson
689234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_Z1f2S2ILin100EE
697a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlssonvoid f(S2<-100>) {}
707a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlsson
717a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlssontemplate <bool B> struct S3 {};
727a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlsson
739234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_Z1f2S3ILb1EE
747a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlssonvoid f(S3<true>) {}
757a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlsson
769234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_Z1f2S3ILb0EE
777a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlssonvoid f(S3<false>) {}
787a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlsson
799234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_Z2f22S3ILb1EE
807a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlssonvoid f2(S3<100>) {}
810e650017acdbbeb0c590e77bbea88c200ea1caefAnders Carlsson
820e650017acdbbeb0c590e77bbea88c200ea1caefAnders Carlssonstruct S;
830e650017acdbbeb0c590e77bbea88c200ea1caefAnders Carlsson
849234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_Z1fM1SKFvvE
850e650017acdbbeb0c590e77bbea88c200ea1caefAnders Carlssonvoid f(void (S::*)() const) {}
860e650017acdbbeb0c590e77bbea88c200ea1caefAnders Carlsson
879234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_Z1fM1SFvvE
880e650017acdbbeb0c590e77bbea88c200ea1caefAnders Carlssonvoid f(void (S::*)()) {}
89cf85b933fef4ce827df83ef2d22c322ab2078aa5Anders Carlsson
909234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_Z1fi
91cf85b933fef4ce827df83ef2d22c322ab2078aa5Anders Carlssonvoid f(const int) { }
92cf85b933fef4ce827df83ef2d22c322ab2078aa5Anders Carlsson
9303c9d530dbdcbb00b0b1ac0abced5dcce2e21408Anders Carlssontemplate<typename T, typename U> void ft1(U u, T t) { }
9403c9d530dbdcbb00b0b1ac0abced5dcce2e21408Anders Carlsson
9503c9d530dbdcbb00b0b1ac0abced5dcce2e21408Anders Carlssontemplate<typename T> void ft2(T t, void (*)(T), void (*)(T)) { }
969234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson
977624f219388f2434a4988ba2508a6ca7b57ba1c3Anders Carlssontemplate<typename T, typename U = S1<T> > struct S4 { };
987624f219388f2434a4988ba2508a6ca7b57ba1c3Anders Carlssontemplate<typename T> void ft3(S4<T>*) {  }
997624f219388f2434a4988ba2508a6ca7b57ba1c3Anders Carlsson
1007482e247163978792654ca1a99913e19dd507e0aAnders Carlssonnamespace NS {
1017482e247163978792654ca1a99913e19dd507e0aAnders Carlsson  template<typename T> void ft1(T) { }
1027624f219388f2434a4988ba2508a6ca7b57ba1c3Anders Carlsson}
1037624f219388f2434a4988ba2508a6ca7b57ba1c3Anders Carlsson
104d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlssonvoid g1() {
10503c9d530dbdcbb00b0b1ac0abced5dcce2e21408Anders Carlsson  // CHECK: @_Z3ft1IidEvT0_T_
10603c9d530dbdcbb00b0b1ac0abced5dcce2e21408Anders Carlsson  ft1<int, double>(1, 0);
10703c9d530dbdcbb00b0b1ac0abced5dcce2e21408Anders Carlsson
10803c9d530dbdcbb00b0b1ac0abced5dcce2e21408Anders Carlsson  // CHECK: @_Z3ft2IcEvT_PFvS0_ES2_
10903c9d530dbdcbb00b0b1ac0abced5dcce2e21408Anders Carlsson  ft2<char>(1, 0, 0);
1107624f219388f2434a4988ba2508a6ca7b57ba1c3Anders Carlsson
1117624f219388f2434a4988ba2508a6ca7b57ba1c3Anders Carlsson  // CHECK: @_Z3ft3IiEvP2S4IT_2S1IS1_EE
1127624f219388f2434a4988ba2508a6ca7b57ba1c3Anders Carlsson  ft3<int>(0);
1137482e247163978792654ca1a99913e19dd507e0aAnders Carlsson
1147482e247163978792654ca1a99913e19dd507e0aAnders Carlsson  // CHECK: @_ZN2NS3ft1IiEEvT_
1157482e247163978792654ca1a99913e19dd507e0aAnders Carlsson  NS::ft1<int>(1);
1167482e247163978792654ca1a99913e19dd507e0aAnders Carlsson}
1177482e247163978792654ca1a99913e19dd507e0aAnders Carlsson
118d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlsson// Expressions
119d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlssontemplate<int I> struct S5 { };
120d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlsson
121d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlssontemplate<int I> void ft4(S5<I>) { }
122d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlssonvoid g2() {
123d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlsson  // CHECK: @_Z3ft4ILi10EEv2S5IXT_EE
124d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlsson  ft4(S5<10>());
125d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlsson
126d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlsson  // CHECK: @_Z3ft4ILi20EEv2S5IXT_EE
127d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlsson  ft4(S5<20>());
128d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlsson}
129d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlsson
1307482e247163978792654ca1a99913e19dd507e0aAnders Carlssonextern "C++" {
1317482e247163978792654ca1a99913e19dd507e0aAnders Carlsson  // CHECK: @_Z1hv
1327482e247163978792654ca1a99913e19dd507e0aAnders Carlsson void h() { }
133d58d6f778de936516d8815783f2e88348c41dce4Anders Carlsson}
1347482e247163978792654ca1a99913e19dd507e0aAnders Carlsson
1355cc58c6cfe4a6378287dbf92f9b1a23e133a6118Anders Carlsson// PR5019
1365cc58c6cfe4a6378287dbf92f9b1a23e133a6118Anders Carlssonextern "C" { struct a { int b; }; }
1375cc58c6cfe4a6378287dbf92f9b1a23e133a6118Anders Carlsson
1385cc58c6cfe4a6378287dbf92f9b1a23e133a6118Anders Carlsson// CHECK: @_Z1fP1a
1395cc58c6cfe4a6378287dbf92f9b1a23e133a6118Anders Carlssonint f(struct a *x) {
1405cc58c6cfe4a6378287dbf92f9b1a23e133a6118Anders Carlsson    return x->b;
1415cc58c6cfe4a6378287dbf92f9b1a23e133a6118Anders Carlsson}
142add28829c7a8d3c5da9ae140f18d3c9ad2d8b599Anders Carlsson
143add28829c7a8d3c5da9ae140f18d3c9ad2d8b599Anders Carlsson// PR5017
144add28829c7a8d3c5da9ae140f18d3c9ad2d8b599Anders Carlssonextern "C" {
145add28829c7a8d3c5da9ae140f18d3c9ad2d8b599Anders Carlssonstruct Debug {
1468257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson  const Debug& operator<< (unsigned a) const { return *this; }
147add28829c7a8d3c5da9ae140f18d3c9ad2d8b599Anders Carlsson};
148add28829c7a8d3c5da9ae140f18d3c9ad2d8b599Anders CarlssonDebug dbg;
149add28829c7a8d3c5da9ae140f18d3c9ad2d8b599Anders Carlsson// CHECK: @_ZNK5DebuglsEj
150add28829c7a8d3c5da9ae140f18d3c9ad2d8b599Anders Carlssonint main(void) {  dbg << 32 ;}
151add28829c7a8d3c5da9ae140f18d3c9ad2d8b599Anders Carlsson}
152ae3524866124021f3bc695886668254093c0793fAnders Carlsson
153ae3524866124021f3bc695886668254093c0793fAnders Carlssontemplate<typename T> struct S6 {
154ae3524866124021f3bc695886668254093c0793fAnders Carlsson  typedef int B;
155ae3524866124021f3bc695886668254093c0793fAnders Carlsson};
156ae3524866124021f3bc695886668254093c0793fAnders Carlsson
157ae3524866124021f3bc695886668254093c0793fAnders Carlssontemplate<typename T> void ft5(typename S6<T>::B) { }
158ae3524866124021f3bc695886668254093c0793fAnders Carlsson// CHECK: @_Z3ft5IiEvN2S6IT_E1BE
159ae3524866124021f3bc695886668254093c0793fAnders Carlssontemplate void ft5<int>(int);
1601668f2062b237ddb137f5d16388b3dea49651f85Anders Carlsson
1611668f2062b237ddb137f5d16388b3dea49651f85Anders Carlssontemplate<typename T> class A {};
1621668f2062b237ddb137f5d16388b3dea49651f85Anders Carlsson
1631668f2062b237ddb137f5d16388b3dea49651f85Anders Carlssonnamespace NS {
1641668f2062b237ddb137f5d16388b3dea49651f85Anders Carlssontemplate<typename T> bool operator==(const A<T>&, const A<T>&) { return true; }
1651668f2062b237ddb137f5d16388b3dea49651f85Anders Carlsson}
1661668f2062b237ddb137f5d16388b3dea49651f85Anders Carlsson
167aeb85374e92619b8e4ce92ac6e30756b5053a137Anders Carlsson// CHECK: @_ZN2NSeqIcEEbRK1AIT_ES5_
1681668f2062b237ddb137f5d16388b3dea49651f85Anders Carlssontemplate bool NS::operator==(const ::A<char>&, const ::A<char>&);
1691668f2062b237ddb137f5d16388b3dea49651f85Anders Carlsson
1701668f2062b237ddb137f5d16388b3dea49651f85Anders Carlssonnamespace std {
1711668f2062b237ddb137f5d16388b3dea49651f85Anders Carlssontemplate<typename T> bool operator==(const A<T>&, const A<T>&) { return true; }
1721668f2062b237ddb137f5d16388b3dea49651f85Anders Carlsson}
1731668f2062b237ddb137f5d16388b3dea49651f85Anders Carlsson
1741668f2062b237ddb137f5d16388b3dea49651f85Anders Carlsson// CHECK: @_ZSteqIcEbRK1AIT_ES4_
1751668f2062b237ddb137f5d16388b3dea49651f85Anders Carlssontemplate bool std::operator==(const ::A<char>&, const ::A<char>&);
1761668f2062b237ddb137f5d16388b3dea49651f85Anders Carlsson
1770ccdf8d62cba2ad730001f133b6cc4836c42da83Anders Carlssonstruct S {
1780ccdf8d62cba2ad730001f133b6cc4836c42da83Anders Carlsson  typedef int U;
1790ccdf8d62cba2ad730001f133b6cc4836c42da83Anders Carlsson};
1800ccdf8d62cba2ad730001f133b6cc4836c42da83Anders Carlsson
1810ccdf8d62cba2ad730001f133b6cc4836c42da83Anders Carlssontemplate <typename T> typename T::U ft6(const T&) { return 0; }
1820ccdf8d62cba2ad730001f133b6cc4836c42da83Anders Carlsson
1830ccdf8d62cba2ad730001f133b6cc4836c42da83Anders Carlsson// CHECK: @_Z3ft6I1SENT_1UERKS1_
1840ccdf8d62cba2ad730001f133b6cc4836c42da83Anders Carlssontemplate int ft6<S>(const S&);
18550755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlsson
18650755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlssontemplate<typename> struct __is_scalar {
18750755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlsson  enum { __value = 1 };
18850755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlsson};
18950755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlsson
19050755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlssontemplate<bool, typename> struct __enable_if { };
19150755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlsson
19250755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlssontemplate<typename T> struct __enable_if<true, T> {
19350755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlsson  typedef T __type;
19450755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlsson};
19550755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlsson
19650755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlsson// PR5063
19750755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlssontemplate<typename T> typename __enable_if<__is_scalar<T>::__value, void>::__type ft7() { }
19850755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlsson
19950755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlsson// CHECK: @_Z3ft7IiEN11__enable_ifIXsr11__is_scalarIT_E7__valueEvE6__typeEv
20050755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlssontemplate void ft7<int>();
20150755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlsson// CHECK: @_Z3ft7IPvEN11__enable_ifIXsr11__is_scalarIT_E7__valueEvE6__typeEv
20250755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlssontemplate void ft7<void*>();
203b217c1b9d2225521f4021984ad5a424784fa22bbAnders Carlsson
204b217c1b9d2225521f4021984ad5a424784fa22bbAnders Carlsson// PR5144
205b217c1b9d2225521f4021984ad5a424784fa22bbAnders Carlssonextern "C" {
206b217c1b9d2225521f4021984ad5a424784fa22bbAnders Carlssonvoid extern_f(void);
207b217c1b9d2225521f4021984ad5a424784fa22bbAnders Carlsson};
208b217c1b9d2225521f4021984ad5a424784fa22bbAnders Carlsson
209b217c1b9d2225521f4021984ad5a424784fa22bbAnders Carlsson// CHECK: @extern_f
210b217c1b9d2225521f4021984ad5a424784fa22bbAnders Carlssonvoid extern_f(void) { }
211b217c1b9d2225521f4021984ad5a424784fa22bbAnders Carlsson
212c4355b6883382b85cda3b7337587784dabf3450bAnders Carlssonstruct S7 {
2135c478cf2d54157062cd843737324e0d0df03a464Anders Carlsson  S7();
214c4355b6883382b85cda3b7337587784dabf3450bAnders Carlsson
2155c478cf2d54157062cd843737324e0d0df03a464Anders Carlsson  struct S { S(); };
216c4355b6883382b85cda3b7337587784dabf3450bAnders Carlsson  struct {
217c4355b6883382b85cda3b7337587784dabf3450bAnders Carlsson    S s;
218c4355b6883382b85cda3b7337587784dabf3450bAnders Carlsson  } a;
219c4355b6883382b85cda3b7337587784dabf3450bAnders Carlsson};
220c4355b6883382b85cda3b7337587784dabf3450bAnders Carlsson
221c4355b6883382b85cda3b7337587784dabf3450bAnders Carlsson// PR5139
2228e51a1f5da6ef4a1a168d14116c6eed3a578a263John McCall// CHECK: @_ZN2S7C1Ev
223c4355b6883382b85cda3b7337587784dabf3450bAnders Carlsson// CHECK: @_ZN2S7C2Ev
224c4355b6883382b85cda3b7337587784dabf3450bAnders Carlsson// CHECK: @"_ZN2S73$_0C1Ev"
225c4355b6883382b85cda3b7337587784dabf3450bAnders CarlssonS7::S7() {}
226c4355b6883382b85cda3b7337587784dabf3450bAnders Carlsson
227a7694087e4abaea261918ffbb3ffe38feb1da489Anders Carlsson// PR5063
228a7694087e4abaea261918ffbb3ffe38feb1da489Anders Carlssontemplate<typename T> typename __enable_if<(__is_scalar<T>::__value), void>::__type ft8() { }
229a7694087e4abaea261918ffbb3ffe38feb1da489Anders Carlsson// CHECK: @_Z3ft8IiEN11__enable_ifIXsr11__is_scalarIT_E7__valueEvE6__typeEv
230a7694087e4abaea261918ffbb3ffe38feb1da489Anders Carlssontemplate void ft8<int>();
231a7694087e4abaea261918ffbb3ffe38feb1da489Anders Carlsson// CHECK: @_Z3ft8IPvEN11__enable_ifIXsr11__is_scalarIT_E7__valueEvE6__typeEv
232a7694087e4abaea261918ffbb3ffe38feb1da489Anders Carlssontemplate void ft8<void*>();
233e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson
23458040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlsson// PR5796
23558040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlssonnamespace PR5796 {
23658040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlssontemplate<typename> struct __is_scalar {
23758040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlsson  enum { __value = 0 };
23858040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlsson};
23958040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlsson
24058040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlssontemplate<bool, typename> struct __enable_if {};
24158040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlssontemplate<typename T> struct __enable_if<true, T> { typedef T __type; };
24258040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlssontemplate<typename T>
24358040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlsson
24458040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlsson// CHECK: define linkonce_odr void @_ZN6PR57968__fill_aIiEENS_11__enable_ifIXntsrNS_11__is_scalarIT_EE7__valueEvE6__typeEv
24558040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlssontypename __enable_if<!__is_scalar<T>::__value, void>::__type __fill_a() { };
24658040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlsson
24758040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlssonvoid f() { __fill_a<int>(); }
24858040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlsson}
24958040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlsson
250e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlssonnamespace Expressions {
251e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson// Unary operators.
252e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson
2538f51a4f2d00b0abda3cde7f3828fb2e2b9beafb5Douglas Gregor// CHECK: define weak_odr void @_ZN11Expressions2f1ILi1EEEvPAplngT_Li2E_i
254e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlssontemplate <int i> void f1(int (*)[(-i) + 2]) { };
255e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlssontemplate void f1<1>(int (*)[1]);
256e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson
2578f51a4f2d00b0abda3cde7f3828fb2e2b9beafb5Douglas Gregor// CHECK: define weak_odr void @_ZN11Expressions2f2ILi1EEEvPApsT__i
258e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlssontemplate <int i> void f2(int (*)[+i]) { };
259e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlssontemplate void f2<1>(int (*)[1]);
260e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson
261e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson// Binary operators.
262e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson
2638f51a4f2d00b0abda3cde7f3828fb2e2b9beafb5Douglas Gregor// CHECK: define weak_odr void @_ZN11Expressions2f3ILi1EEEvPAplT_T__i
264e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlssontemplate <int i> void f3(int (*)[i+i]) { };
265e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlssontemplate void f3<1>(int (*)[2]);
266e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson
2678f51a4f2d00b0abda3cde7f3828fb2e2b9beafb5Douglas Gregor// CHECK: define weak_odr void @_ZN11Expressions2f4ILi1EEEvPAplplLi2ET_T__i
268e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlssontemplate <int i> void f4(int (*)[2 + i+i]) { };
269e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlssontemplate void f4<1>(int (*)[4]);
270e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson
271e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson// The ternary operator.
2728f51a4f2d00b0abda3cde7f3828fb2e2b9beafb5Douglas Gregor// CHECK: define weak_odr void @_ZN11Expressions2f4ILb1EEEvPAquT_Li1ELi2E_i
273e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlssontemplate <bool b> void f4(int (*)[b ? 1 : 2]) { };
274e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlssontemplate void f4<true>(int (*)[1]);
275e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson}
2768257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson
2778257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlssonstruct Ops {
2788257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson  Ops& operator+(const Ops&);
2798257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson  Ops& operator-(const Ops&);
2808257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson  Ops& operator&(const Ops&);
2818257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson  Ops& operator*(const Ops&);
2828257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson
2838257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson  void *v;
2848257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson};
2858257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson
2868257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson// CHECK: define %struct.Ops* @_ZN3OpsplERKS_
2878257d411a759b91921681c3b7f79e50e0d9252dbAnders CarlssonOps& Ops::operator+(const Ops&) { return *this; }
2888257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson// CHECK: define %struct.Ops* @_ZN3OpsmiERKS_
2898257d411a759b91921681c3b7f79e50e0d9252dbAnders CarlssonOps& Ops::operator-(const Ops&) { return *this; }
2908257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson// CHECK: define %struct.Ops* @_ZN3OpsanERKS_
2918257d411a759b91921681c3b7f79e50e0d9252dbAnders CarlssonOps& Ops::operator&(const Ops&) { return *this; }
2928257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson// CHECK: define %struct.Ops* @_ZN3OpsmlERKS_
2938257d411a759b91921681c3b7f79e50e0d9252dbAnders CarlssonOps& Ops::operator*(const Ops&) { return *this; }
2948257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson
2959e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlsson// PR5861
2969e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlssonnamespace PR5861 {
2979e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlssontemplate<bool> class P;
2989e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlssontemplate<> class P<true> {};
2999e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlsson
3009e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlssontemplate<template <bool> class, bool>
3019e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlssonstruct Policy { };
3029e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlsson
3039e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlssontemplate<typename T, typename = Policy<P, true> > class Alloc
3049e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlsson{
3059e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlsson  T *allocate(int, const void*) { return 0; }
3069e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlsson};
3079e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlsson
3088f51a4f2d00b0abda3cde7f3828fb2e2b9beafb5Douglas Gregor// CHECK: define weak_odr i8* @_ZN6PR58615AllocIcNS_6PolicyINS_1PELb1EEEE8allocateEiPKv
3099e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlssontemplate class Alloc<char>;
3109e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlsson}
311f28c687866aed1ed7b4b9ddf44a51673861236cfAnders Carlsson
312f28c687866aed1ed7b4b9ddf44a51673861236cfAnders Carlsson// CHECK: define void @_Z1fU13block_pointerFiiiE
313a9efbf009468f36df0bb66551677339055757d51Nuno Lopesvoid f(int (^)(int, int)) { }
314a9efbf009468f36df0bb66551677339055757d51Nuno Lopes
31531455256ae26cc7069111643ec4429ea564377daSean Huntvoid pr5966_foo() {
31631455256ae26cc7069111643ec4429ea564377daSean Hunt  extern int pr5966_i;
31731455256ae26cc7069111643ec4429ea564377daSean Hunt  pr5966_i = 0;
31831455256ae26cc7069111643ec4429ea564377daSean Hunt}
31931455256ae26cc7069111643ec4429ea564377daSean Hunt
32031455256ae26cc7069111643ec4429ea564377daSean Huntstatic int pr5966_i;
32131455256ae26cc7069111643ec4429ea564377daSean Hunt
32231455256ae26cc7069111643ec4429ea564377daSean Huntvoid pr5966_bar() {
32331455256ae26cc7069111643ec4429ea564377daSean Hunt  pr5966_i = 0;
32431455256ae26cc7069111643ec4429ea564377daSean Hunt}
3251dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall
3261dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCallnamespace test0 {
3271dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall  int ovl(int x);
3281dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall  char ovl(double x);
3291dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall
3301dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall  template <class T> void f(T, char (&buffer)[sizeof(ovl(T()))]) {}
3311dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall
3321dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall  void test0() {
3331dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall    char buffer[1];
3341dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall    f(0.0, buffer);
3351dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall  }
3361dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall  // CHECK: define void @_ZN5test05test0Ev()
3371dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall  // CHECK: define linkonce_odr void @_ZN5test01fIdEEvT_RAszcl3ovlcvS1__EE_c(
3381dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall
3391dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall  void test1() {
3401dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall    char buffer[sizeof(int)];
3411dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall    f(1, buffer);
3421dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall  }
3431dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall  // CHECK: define void @_ZN5test05test1Ev()
3441dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall  // CHECK: define linkonce_odr void @_ZN5test01fIiEEvT_RAszcl3ovlcvS1__EE_c(
3451dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall
3461dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall  template <class T> void g(char (&buffer)[sizeof(T() + 5.0f)]) {}
3471dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall  void test2() {
3481dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall    char buffer[sizeof(float)];
3491dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall    g<float>(buffer);
3501dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall  }
3511dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall  // CHECK: define linkonce_odr void @_ZN5test01gIfEEvRAszplcvT__ELf40A00000E_c(
3521dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall
3531dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall  template <class T> void h(char (&buffer)[sizeof(T() + 5.0)]) {}
3541dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall  void test3() {
3551dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall    char buffer[sizeof(double)];
3561dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall    h<float>(buffer);
3571dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall  }
3581dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall  // CHECK: define linkonce_odr void @_ZN5test01hIfEEvRAszplcvT__ELd4014000000000000E_c(
3592f27bf854f0519810b34afd209089cc75536b757John McCall
3602f27bf854f0519810b34afd209089cc75536b757John McCall  template <class T> void j(char (&buffer)[sizeof(T().buffer)]) {}
3612f27bf854f0519810b34afd209089cc75536b757John McCall  struct A { double buffer[128]; };
3622f27bf854f0519810b34afd209089cc75536b757John McCall  void test4() {
3632f27bf854f0519810b34afd209089cc75536b757John McCall    char buffer[1024];
3642f27bf854f0519810b34afd209089cc75536b757John McCall    j<A>(buffer);
3652f27bf854f0519810b34afd209089cc75536b757John McCall  }
366e1e342f4a96f132d8d7e802284417bd520f9f4f8John McCall  // CHECK: define linkonce_odr void @_ZN5test01jINS_1AEEEvRAszdtcvT__E6buffer_c(
3671dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall}
36832fb4e1fd1cbd2ff006cc0e06c997e4eea2f0e28Douglas Gregor
36932fb4e1fd1cbd2ff006cc0e06c997e4eea2f0e28Douglas Gregornamespace test1 {
37032fb4e1fd1cbd2ff006cc0e06c997e4eea2f0e28Douglas Gregor  template<typename T> struct X { };
37132fb4e1fd1cbd2ff006cc0e06c997e4eea2f0e28Douglas Gregor  template<template<class> class Y, typename T> void f(Y<T>) { }
3728f51a4f2d00b0abda3cde7f3828fb2e2b9beafb5Douglas Gregor  // CHECK: define weak_odr void @_ZN5test11fINS_1XEiEEvT_IT0_E
37332fb4e1fd1cbd2ff006cc0e06c997e4eea2f0e28Douglas Gregor  template void f(X<int>);
37432fb4e1fd1cbd2ff006cc0e06c997e4eea2f0e28Douglas Gregor}
375aec2523ab2c91413ef2f66dc944d0d6ac6a58abeAnders Carlsson
376aec2523ab2c91413ef2f66dc944d0d6ac6a58abeAnders Carlsson// CHECK: define internal void @_Z27functionWithInternalLinkagev()
377aec2523ab2c91413ef2f66dc944d0d6ac6a58abeAnders Carlssonstatic void functionWithInternalLinkage() {  }
378aec2523ab2c91413ef2f66dc944d0d6ac6a58abeAnders Carlssonvoid g() { functionWithInternalLinkage(); }
379ad5e73887052193afda72db8efcb812bd083a4a8John McCall
380ad5e73887052193afda72db8efcb812bd083a4a8John McCallnamespace test2 {
381ad5e73887052193afda72db8efcb812bd083a4a8John McCall  template <class T> decltype(((T*) 0)->member) read_member(T& obj) {
382ad5e73887052193afda72db8efcb812bd083a4a8John McCall    return obj.member;
383ad5e73887052193afda72db8efcb812bd083a4a8John McCall  }
384ad5e73887052193afda72db8efcb812bd083a4a8John McCall
385ad5e73887052193afda72db8efcb812bd083a4a8John McCall  struct A { int member; } obj;
386ad5e73887052193afda72db8efcb812bd083a4a8John McCall  int test() {
387ad5e73887052193afda72db8efcb812bd083a4a8John McCall    return read_member(obj);
388ad5e73887052193afda72db8efcb812bd083a4a8John McCall  }
389ad5e73887052193afda72db8efcb812bd083a4a8John McCall
390ad5e73887052193afda72db8efcb812bd083a4a8John McCall  // CHECK: define linkonce_odr i32 @_ZN5test211read_memberINS_1AEEEDtptcvPT_Li0E6memberERS2_(
391ad5e73887052193afda72db8efcb812bd083a4a8John McCall}
392ad5e73887052193afda72db8efcb812bd083a4a8John McCall
393ad5e73887052193afda72db8efcb812bd083a4a8John McCallnamespace test3 {
394ad5e73887052193afda72db8efcb812bd083a4a8John McCall  struct AmbiguousBase { int ab; };
395ad5e73887052193afda72db8efcb812bd083a4a8John McCall  struct Path1 : AmbiguousBase { float p; };
396ad5e73887052193afda72db8efcb812bd083a4a8John McCall  struct Path2 : AmbiguousBase { double p; };
397ad5e73887052193afda72db8efcb812bd083a4a8John McCall  struct Derived : Path1, Path2 { };
398ad5e73887052193afda72db8efcb812bd083a4a8John McCall
399ad5e73887052193afda72db8efcb812bd083a4a8John McCall  //template <class T> decltype(((T*) 0)->Path1::ab) get_ab_1(T &ref) { return ref.Path1::ab; }
400ad5e73887052193afda72db8efcb812bd083a4a8John McCall  //template <class T> decltype(((T*) 0)->Path2::ab) get_ab_2(T &ref) { return ref.Path2::ab; }
401ad5e73887052193afda72db8efcb812bd083a4a8John McCall
4028f51a4f2d00b0abda3cde7f3828fb2e2b9beafb5Douglas Gregor  // define weak_odr float @_ZN5test37get_p_1INS_7DerivedEEEDtptcvPT_Li0E5Path11pERS2_(
403ad5e73887052193afda72db8efcb812bd083a4a8John McCall  template <class T> decltype(((T*) 0)->Path1::p) get_p_1(T &ref) { return ref.Path1::p; }
404ad5e73887052193afda72db8efcb812bd083a4a8John McCall
4058f51a4f2d00b0abda3cde7f3828fb2e2b9beafb5Douglas Gregor  // define weak_odr double @_ZN5test37get_p_1INS_7DerivedEEEDtptcvPT_Li0E5Path21pERS2_(
406ad5e73887052193afda72db8efcb812bd083a4a8John McCall  template <class T> decltype(((T*) 0)->Path2::p) get_p_2(T &ref) { return ref.Path2::p; }
407ad5e73887052193afda72db8efcb812bd083a4a8John McCall
408ad5e73887052193afda72db8efcb812bd083a4a8John McCall  Derived obj;
409ad5e73887052193afda72db8efcb812bd083a4a8John McCall  void test() {
410ad5e73887052193afda72db8efcb812bd083a4a8John McCall    // FIXME: uncomment these when we support diamonds competently
411ad5e73887052193afda72db8efcb812bd083a4a8John McCall    //get_ab_1(obj);
412ad5e73887052193afda72db8efcb812bd083a4a8John McCall    //get_ab_2(obj);
413ad5e73887052193afda72db8efcb812bd083a4a8John McCall    get_p_1(obj);
414ad5e73887052193afda72db8efcb812bd083a4a8John McCall    get_p_2(obj);
415ad5e73887052193afda72db8efcb812bd083a4a8John McCall  }
416ad5e73887052193afda72db8efcb812bd083a4a8John McCall}
417d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola
418d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola// CHECK: define void @_ZN5test41gEPNS_3zedIXadL_ZNS_3foo3barEEEEE
419d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindolanamespace test4 {
420d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  struct foo { int bar; };
421d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  template <int (foo::*)>
422d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  struct zed {};
423d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  void g(zed<&foo::bar>*)
424d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  {}
425d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola}
426d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola// CHECK: define void @_ZN5test51gEPNS_3zedIXadL_ZNS_3foo3barEEEEE
427d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindolanamespace test5 {
428d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  struct foo { static int bar; };
429d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  template <int *>
430d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  struct zed {};
431d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  void g(zed<&foo::bar>*)
432d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  {}
433d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola}
434d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola// CHECK: define void @_ZN5test61gEPNS_3zedIXadL_ZNS_3foo3barEvEEEE
435d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindolanamespace test6 {
436d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  struct foo { int bar(); };
437d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  template <int (foo::*)()>
438d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  struct zed {};
439d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  void g(zed<&foo::bar>*)
440d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  {}
441d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola}
442d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola// CHECK: define void @_ZN5test71gEPNS_3zedIXadL_ZNS_3foo3barEvEEEE
443d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindolanamespace test7 {
444d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  struct foo { static int bar(); };
445d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  template <int (*f)()>
446d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  struct zed {};
447d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  void g(zed<&foo::bar>*)
448d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  {}
449d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola}
4508f51a4f2d00b0abda3cde7f3828fb2e2b9beafb5Douglas Gregor// CHECK: define weak_odr void @_ZN5test81AILZNS_1B5valueEEE3incEv
451d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindolanamespace test8 {
452d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  template <int &counter> class A { void inc() { counter++; } };
4537002f4c03c2d0544f4e8bea8d3a5636519081e35John McCall  class B { public: static int value; };
454d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  template class A<B::value>;
455d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola}
4569b35b25db3641dfa8876d24b41cfa5b4d51477cbRafael Espindola// CHECK: declare void @_ZN5test91fIiNS_3barEEEvRKNT0_3baz1XE
4579b35b25db3641dfa8876d24b41cfa5b4d51477cbRafael Espindolanamespace test9 {
4589b35b25db3641dfa8876d24b41cfa5b4d51477cbRafael Espindola  template<class T>
4599b35b25db3641dfa8876d24b41cfa5b4d51477cbRafael Espindola  struct foo {
4609b35b25db3641dfa8876d24b41cfa5b4d51477cbRafael Espindola    typedef T X;
4619b35b25db3641dfa8876d24b41cfa5b4d51477cbRafael Espindola  };
4629b35b25db3641dfa8876d24b41cfa5b4d51477cbRafael Espindola  struct bar {
4639b35b25db3641dfa8876d24b41cfa5b4d51477cbRafael Espindola    typedef foo<int> baz;
4649b35b25db3641dfa8876d24b41cfa5b4d51477cbRafael Espindola  };
4659b35b25db3641dfa8876d24b41cfa5b4d51477cbRafael Espindola  template <class zaz, class zed>
4669b35b25db3641dfa8876d24b41cfa5b4d51477cbRafael Espindola  void f(const typename zed::baz::X&);
4679b35b25db3641dfa8876d24b41cfa5b4d51477cbRafael Espindola  void g() {
4689b35b25db3641dfa8876d24b41cfa5b4d51477cbRafael Espindola    f<int, bar>( 0);
4699b35b25db3641dfa8876d24b41cfa5b4d51477cbRafael Espindola  }
4709b35b25db3641dfa8876d24b41cfa5b4d51477cbRafael Espindola}
471de81063acdc999fbe1225f466ead12f7e9107acfJohn McCall
472de81063acdc999fbe1225f466ead12f7e9107acfJohn McCall// <rdar://problem/7825453>
473de81063acdc999fbe1225f466ead12f7e9107acfJohn McCallnamespace test10 {
474de81063acdc999fbe1225f466ead12f7e9107acfJohn McCall  template <char P1> struct S {};
475de81063acdc999fbe1225f466ead12f7e9107acfJohn McCall  template <char P2> void f(struct S<false ? 'a' : P2> ) {}
476de81063acdc999fbe1225f466ead12f7e9107acfJohn McCall
477de81063acdc999fbe1225f466ead12f7e9107acfJohn McCall  // CHECK: define weak_odr void @_ZN6test101fILc3EEEvNS_1SIXquLb0ELc97ET_EEE(
478de81063acdc999fbe1225f466ead12f7e9107acfJohn McCall  template void f<(char) 3>(struct S<3>);
479de81063acdc999fbe1225f466ead12f7e9107acfJohn McCall}
48093296683a70eed2fae0b694748ed4cc51c53aef4Anders Carlsson
48193296683a70eed2fae0b694748ed4cc51c53aef4Anders Carlssonnamespace test11 {
48293296683a70eed2fae0b694748ed4cc51c53aef4Anders Carlsson  // CHECK: @_ZN6test111fEz
48393296683a70eed2fae0b694748ed4cc51c53aef4Anders Carlsson  void f(...) { }
48493296683a70eed2fae0b694748ed4cc51c53aef4Anders Carlsson
48593296683a70eed2fae0b694748ed4cc51c53aef4Anders Carlsson  struct A {
48693296683a70eed2fae0b694748ed4cc51c53aef4Anders Carlsson    void f(...);
48793296683a70eed2fae0b694748ed4cc51c53aef4Anders Carlsson  };
48893296683a70eed2fae0b694748ed4cc51c53aef4Anders Carlsson
48993296683a70eed2fae0b694748ed4cc51c53aef4Anders Carlsson  // CHECK: @_ZN6test111A1fEz
49093296683a70eed2fae0b694748ed4cc51c53aef4Anders Carlsson  void A::f(...) { }
49193296683a70eed2fae0b694748ed4cc51c53aef4Anders Carlsson}
492dfc0d1ff1af5b199945a1ff98a6f7db0fdfb1615Anders Carlsson
493dfc0d1ff1af5b199945a1ff98a6f7db0fdfb1615Anders Carlssonnamespace test12 {
494dfc0d1ff1af5b199945a1ff98a6f7db0fdfb1615Anders Carlsson
495dfc0d1ff1af5b199945a1ff98a6f7db0fdfb1615Anders Carlsson  // CHECK: _ZN6test121fENS_1AILt33000EEE
496dfc0d1ff1af5b199945a1ff98a6f7db0fdfb1615Anders Carlsson  template <unsigned short> struct A { };
497dfc0d1ff1af5b199945a1ff98a6f7db0fdfb1615Anders Carlsson  void f(A<33000>) { }
498b6f532e2b03dbbfd97a37a7bb845fe23f8136889John McCall}
499b6f532e2b03dbbfd97a37a7bb845fe23f8136889John McCall
500b6f532e2b03dbbfd97a37a7bb845fe23f8136889John McCall// PR7446
501b6f532e2b03dbbfd97a37a7bb845fe23f8136889John McCallnamespace test13 {
502b6f532e2b03dbbfd97a37a7bb845fe23f8136889John McCall  template <template <class> class T> class A {};
503b6f532e2b03dbbfd97a37a7bb845fe23f8136889John McCall  template <class U> class B {};
504b6f532e2b03dbbfd97a37a7bb845fe23f8136889John McCall
505b6f532e2b03dbbfd97a37a7bb845fe23f8136889John McCall  template <template<class> class T> void foo(const A<T> &a) {}
506b6f532e2b03dbbfd97a37a7bb845fe23f8136889John McCall
507b6f532e2b03dbbfd97a37a7bb845fe23f8136889John McCall  // CHECK: define weak_odr void @_ZN6test133fooINS_1BEEEvRKNS_1AIT_EE(
508b6f532e2b03dbbfd97a37a7bb845fe23f8136889John McCall  template void foo(const A<B> &a);
509b6f532e2b03dbbfd97a37a7bb845fe23f8136889John McCall}
510c00cb6409307846a9bbcd86d307a1a91aab659d0Eli Friedman
511c00cb6409307846a9bbcd86d307a1a91aab659d0Eli Friedmannamespace test14 {
512c00cb6409307846a9bbcd86d307a1a91aab659d0Eli Friedman  extern "C" {
513c00cb6409307846a9bbcd86d307a1a91aab659d0Eli Friedman    struct S {
514c00cb6409307846a9bbcd86d307a1a91aab659d0Eli Friedman      static int a(), x;
515c00cb6409307846a9bbcd86d307a1a91aab659d0Eli Friedman    };
516c00cb6409307846a9bbcd86d307a1a91aab659d0Eli Friedman    // CHECK: define i32 @_ZN6test141S1aEv
517c00cb6409307846a9bbcd86d307a1a91aab659d0Eli Friedman    // CHECK: load i32* @_ZN6test141S1xE
518c00cb6409307846a9bbcd86d307a1a91aab659d0Eli Friedman    int S::a() { return S::x; }
519c00cb6409307846a9bbcd86d307a1a91aab659d0Eli Friedman  }
520c00cb6409307846a9bbcd86d307a1a91aab659d0Eli Friedman}
5213dc7e7b9c59b9a2ed4f530b32e710a3738611df7John McCall
5223dc7e7b9c59b9a2ed4f530b32e710a3738611df7John McCall// rdar://problem/8204122
5233dc7e7b9c59b9a2ed4f530b32e710a3738611df7John McCallnamespace test15 {
5243dc7e7b9c59b9a2ed4f530b32e710a3738611df7John McCall  enum E { e = 3 };
5253dc7e7b9c59b9a2ed4f530b32e710a3738611df7John McCall  template <int I> struct S {};
5263dc7e7b9c59b9a2ed4f530b32e710a3738611df7John McCall
5273dc7e7b9c59b9a2ed4f530b32e710a3738611df7John McCall  template <int I> void f(S<I + e>) {}
5283dc7e7b9c59b9a2ed4f530b32e710a3738611df7John McCall
5293dc7e7b9c59b9a2ed4f530b32e710a3738611df7John McCall  // CHECK: define weak_odr void @_ZN6test151fILi7EEEvNS_1SIXplT_LNS_1EE3EEEE(
5303dc7e7b9c59b9a2ed4f530b32e710a3738611df7John McCall  template void f<7>(S<7 + e>);
5313dc7e7b9c59b9a2ed4f530b32e710a3738611df7John McCall}
5327121c8f551d9c91c0cf0e5e1f7f9aafa97241b17John McCall
5337121c8f551d9c91c0cf0e5e1f7f9aafa97241b17John McCall// rdar://problem/8125400.  Don't crash.
5347121c8f551d9c91c0cf0e5e1f7f9aafa97241b17John McCallnamespace test16 {
5357121c8f551d9c91c0cf0e5e1f7f9aafa97241b17John McCall  static union {};
5367121c8f551d9c91c0cf0e5e1f7f9aafa97241b17John McCall  static union { union {}; };
5377121c8f551d9c91c0cf0e5e1f7f9aafa97241b17John McCall  static union { struct {}; };
5387121c8f551d9c91c0cf0e5e1f7f9aafa97241b17John McCall  static union { union { union {}; }; };
5397121c8f551d9c91c0cf0e5e1f7f9aafa97241b17John McCall  static union { union { struct {}; }; };
5407121c8f551d9c91c0cf0e5e1f7f9aafa97241b17John McCall  static union { struct { union {}; }; };
5417121c8f551d9c91c0cf0e5e1f7f9aafa97241b17John McCall  static union { struct { struct {}; }; };
5427121c8f551d9c91c0cf0e5e1f7f9aafa97241b17John McCall}
5436f615bc52bd5513019c32b378834a3c1b8425bf8John McCall
5446f615bc52bd5513019c32b378834a3c1b8425bf8John McCall// rdar://problem/8302148
5456f615bc52bd5513019c32b378834a3c1b8425bf8John McCallnamespace test17 {
5466f615bc52bd5513019c32b378834a3c1b8425bf8John McCall  template <int N> struct A {};
5476f615bc52bd5513019c32b378834a3c1b8425bf8John McCall
5486f615bc52bd5513019c32b378834a3c1b8425bf8John McCall  struct B {
5496f615bc52bd5513019c32b378834a3c1b8425bf8John McCall    static int foo(void);
5506f615bc52bd5513019c32b378834a3c1b8425bf8John McCall  };
5516f615bc52bd5513019c32b378834a3c1b8425bf8John McCall
5526f615bc52bd5513019c32b378834a3c1b8425bf8John McCall  template <class T> A<sizeof(T::foo())> func(void);
5536f615bc52bd5513019c32b378834a3c1b8425bf8John McCall
5546dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  // CHECK: define void @_ZN6test174testEv()
5556f615bc52bd5513019c32b378834a3c1b8425bf8John McCall  // CHECK: call {{.*}} @_ZN6test174funcINS_1BEEENS_1AIXszclsrT_3fooEEEEv()
5566dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  void test() {
5576dbce19fdae4cfae4eb5f826284978e723a04e61John McCall    func<B>();
5586f615bc52bd5513019c32b378834a3c1b8425bf8John McCall  }
5596f615bc52bd5513019c32b378834a3c1b8425bf8John McCall}
5605e1e89b8af283af34943a477dc6378f1a641df26John McCall
5615e1e89b8af283af34943a477dc6378f1a641df26John McCall// PR7891
5625e1e89b8af283af34943a477dc6378f1a641df26John McCallnamespace test18 {
5635e1e89b8af283af34943a477dc6378f1a641df26John McCall  struct A {
5645e1e89b8af283af34943a477dc6378f1a641df26John McCall    int operator+();
5655e1e89b8af283af34943a477dc6378f1a641df26John McCall    int operator-();
5665e1e89b8af283af34943a477dc6378f1a641df26John McCall    int operator*();
5675e1e89b8af283af34943a477dc6378f1a641df26John McCall    int operator&();
5685e1e89b8af283af34943a477dc6378f1a641df26John McCall  };
5695e1e89b8af283af34943a477dc6378f1a641df26John McCall  template <int (A::*)()> struct S {};
5705e1e89b8af283af34943a477dc6378f1a641df26John McCall
5715e1e89b8af283af34943a477dc6378f1a641df26John McCall  template <typename T> void f(S<&T::operator+>) {}
5725e1e89b8af283af34943a477dc6378f1a641df26John McCall  template void f<A>(S<&A::operator+>);
5735e1e89b8af283af34943a477dc6378f1a641df26John McCall
5745e1e89b8af283af34943a477dc6378f1a641df26John McCall  template <typename T> void f(S<&T::operator- >) {}
5755e1e89b8af283af34943a477dc6378f1a641df26John McCall  template void f<A>(S<&A::operator- >);
5765e1e89b8af283af34943a477dc6378f1a641df26John McCall
5775e1e89b8af283af34943a477dc6378f1a641df26John McCall  template <typename T> void f(S<&T::operator*>) {}
5785e1e89b8af283af34943a477dc6378f1a641df26John McCall  template void f<A>(S<&A::operator*>);
5795e1e89b8af283af34943a477dc6378f1a641df26John McCall
5805e1e89b8af283af34943a477dc6378f1a641df26John McCall  template <typename T> void f(S<&T::operator&>) {}
5815e1e89b8af283af34943a477dc6378f1a641df26John McCall  template void f<A>(S<&A::operator&>);
5825e1e89b8af283af34943a477dc6378f1a641df26John McCall
5835e1e89b8af283af34943a477dc6378f1a641df26John McCall  // CHECK: define weak_odr void @_ZN6test181fINS_1AEEEvNS_1SIXadsrT_plEEE
5845e1e89b8af283af34943a477dc6378f1a641df26John McCall  // CHECK: define weak_odr void @_ZN6test181fINS_1AEEEvNS_1SIXadsrT_miEEE
5855e1e89b8af283af34943a477dc6378f1a641df26John McCall  // CHECK: define weak_odr void @_ZN6test181fINS_1AEEEvNS_1SIXadsrT_mlEEE
5865e1e89b8af283af34943a477dc6378f1a641df26John McCall  // CHECK: define weak_odr void @_ZN6test181fINS_1AEEEvNS_1SIXadsrT_anEEE
5875e1e89b8af283af34943a477dc6378f1a641df26John McCall}
5886dbce19fdae4cfae4eb5f826284978e723a04e61John McCall
5896dbce19fdae4cfae4eb5f826284978e723a04e61John McCall// rdar://problem/8332117
5906dbce19fdae4cfae4eb5f826284978e723a04e61John McCallnamespace test19 {
5916dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  struct A {
5926dbce19fdae4cfae4eb5f826284978e723a04e61John McCall    template <typename T> int f();
5936dbce19fdae4cfae4eb5f826284978e723a04e61John McCall    int operator+();
5946dbce19fdae4cfae4eb5f826284978e723a04e61John McCall    operator int();
5956dbce19fdae4cfae4eb5f826284978e723a04e61John McCall    template <typename T> int operator-();
5966dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  };
5976dbce19fdae4cfae4eb5f826284978e723a04e61John McCall
5986dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  template <int (A::*)()> struct S {};
5996dbce19fdae4cfae4eb5f826284978e723a04e61John McCall
6006dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  template <typename T> void g (S<&T::template f<int> >) {}
6016dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  template <typename T> void g (S<&T::operator+ >) {}
6026dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  template <typename T> void g (S<&T::operator int>) {}
6036dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  template <typename T> void g (S<&T::template operator- <double> >) {}
6046dbce19fdae4cfae4eb5f826284978e723a04e61John McCall
6056dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  // CHECK: define weak_odr void @_ZN6test191gINS_1AEEEvNS_1SIXadsrT_1fIiEEEE(
6066dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  template void g<A>(S<&A::f<int> >);
6076dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  // CHECK: define weak_odr void @_ZN6test191gINS_1AEEEvNS_1SIXadsrT_plEEE(
6086dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  template void g<A>(S<&A::operator+>);
6096dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  // CHECK: define weak_odr void @_ZN6test191gINS_1AEEEvNS_1SIXadsrT_cviEEE(
6106dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  template void g<A>(S<&A::operator int>);
6116dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  // CHECK: define weak_odr void @_ZN6test191gINS_1AEEEvNS_1SIXadsrT_miIdEEEE(
6126dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  template void g<A>(S<&A::operator-<double> >);
6136dbce19fdae4cfae4eb5f826284978e723a04e61John McCall}
6146dbce19fdae4cfae4eb5f826284978e723a04e61John McCall
6156dbce19fdae4cfae4eb5f826284978e723a04e61John McCallnamespace test20 {
6166dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  template <class T> T *f(const T&);
6176dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  template <class T> T *f(T*);
6186dbce19fdae4cfae4eb5f826284978e723a04e61John McCall
6196dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  // CHECK: define weak_odr void @_ZN6test205test0IiEEvDTcl1fIPT_ELi0EEE(
6206dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  template <class T> void test0(decltype(f<T*>(0))) {}
6216dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  template void test0<int>(decltype(f<int*>(0)));
6226dbce19fdae4cfae4eb5f826284978e723a04e61John McCall
6236dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  // CHECK: define weak_odr void @_ZN6test205test1IiEEvDTcl1fIEcvT__EEE(
6246dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  template <class T> void test1(decltype(f<>(T()))) {}
6256dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  template void test1<int>(decltype(f<>(int())));
6266dbce19fdae4cfae4eb5f826284978e723a04e61John McCall}
6277281d1fbea62a4549b045bb7dc434904f2b609d8Fariborz Jahanian
6287281d1fbea62a4549b045bb7dc434904f2b609d8Fariborz Jahanian// rdar:// 8620510
6297281d1fbea62a4549b045bb7dc434904f2b609d8Fariborz Jahaniannamespace test21 {
6307281d1fbea62a4549b045bb7dc434904f2b609d8Fariborz Jahanian  // CHECK: define void @_ZN6test2112vla_arg_funcEiPA_i(
6317281d1fbea62a4549b045bb7dc434904f2b609d8Fariborz Jahanian  void vla_arg_func(int X, int a[X][X]) {}
6327281d1fbea62a4549b045bb7dc434904f2b609d8Fariborz Jahanian}
633e292368afa63337f5ff64c967857a898d6f868daAnders Carlsson
634e292368afa63337f5ff64c967857a898d6f868daAnders Carlssonnamespace test22 {
635e292368afa63337f5ff64c967857a898d6f868daAnders Carlsson  // CHECK: define void @_ZN6test221fEDn(
636e292368afa63337f5ff64c967857a898d6f868daAnders Carlsson  void f(decltype(nullptr)) { }
637e292368afa63337f5ff64c967857a898d6f868daAnders Carlsson}
638