1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 -fblocks -std=c++11 | 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
12a41c97a5d1912ffd184381d269fd8e5a25ee5e59Richard Smith//CHECK: @_ZL8pr5966_j = internal global
1331455256ae26cc7069111643ec4429ea564377daSean Hunt
1493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define zeroext i1 @_ZplRK1YRA100_P1X
155f2bfd4811996abb783aa6c7254c56baa6930e8cDouglas Gregorbool operator+(const Y&, X* (&xs)[100]) { return false; }
165f2bfd4811996abb783aa6c7254c56baa6930e8cDouglas Gregor
1793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z1f1s
18b1d947b1011cb559be5745153f292b2dfb46b8e6Anders Carlssontypedef struct { int a; } s;
19b1d947b1011cb559be5745153f292b2dfb46b8e6Anders Carlssonvoid f(s) { }
20b1d947b1011cb559be5745153f292b2dfb46b8e6Anders Carlsson
2193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z1f1e
22b1d947b1011cb559be5745153f292b2dfb46b8e6Anders Carlssontypedef enum { foo } e;
23b1d947b1011cb559be5745153f292b2dfb46b8e6Anders Carlssonvoid f(e) { }
24b1d947b1011cb559be5745153f292b2dfb46b8e6Anders Carlsson
2593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z1f1u
26b1d947b1011cb559be5745153f292b2dfb46b8e6Anders Carlssontypedef union { int a; } u;
27b1d947b1011cb559be5745153f292b2dfb46b8e6Anders Carlssonvoid f(u) { }
284843e584b54460973b8445d38907bab0401ebb0cAnders Carlsson
2993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z1f1x
304843e584b54460973b8445d38907bab0401ebb0cAnders Carlssontypedef struct { int a; } x,y;
314843e584b54460973b8445d38907bab0401ebb0cAnders Carlssonvoid f(y) { }
324843e584b54460973b8445d38907bab0401ebb0cAnders Carlsson
3393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z1fv
34c6c91bc019ff7fa09f6570025ba011aad4c0d004Anders Carlssonvoid f() { }
35984e06874685396ca2cb51f0008cfff7c9b3d9c6Anders Carlsson
3693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_ZN1N1fEv
37984e06874685396ca2cb51f0008cfff7c9b3d9c6Anders Carlssonnamespace N { void f() { } }
38984e06874685396ca2cb51f0008cfff7c9b3d9c6Anders Carlsson
3993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_ZN1N1N1fEv
40984e06874685396ca2cb51f0008cfff7c9b3d9c6Anders Carlssonnamespace N { namespace N { void f() { } } }
4191e20dd8bf1bc8980ee93839383d2bd170bce050Anders Carlsson
4293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: 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
5393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z1fno
542df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattnervoid f(__int128_t, __uint128_t) { }
557a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlsson
567a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlssontemplate <typename T> struct S1 {};
577a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlsson
5893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z1f2S1IiE
597a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlssonvoid f(S1<int>) {}
607a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlsson
6193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z1f2S1IdE
627a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlssonvoid f(S1<double>) {}
637a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlsson
647a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlssontemplate <int N> struct S2 {};
6593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z1f2S2ILi100EE
667a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlssonvoid f(S2<100>) {}
677a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlsson
6893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z1f2S2ILin100EE
697a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlssonvoid f(S2<-100>) {}
707a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlsson
717a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlssontemplate <bool B> struct S3 {};
727a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlsson
7393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z1f2S3ILb1EE
747a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlssonvoid f(S3<true>) {}
757a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlsson
7693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z1f2S3ILb0EE
777a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlssonvoid f(S3<false>) {}
787a0ba875a7dcee94ec74fa79b7f8a247d200a76cAnders Carlsson
790e650017acdbbeb0c590e77bbea88c200ea1caefAnders Carlssonstruct S;
800e650017acdbbeb0c590e77bbea88c200ea1caefAnders Carlsson
8193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z1fM1SKFvvE
820e650017acdbbeb0c590e77bbea88c200ea1caefAnders Carlssonvoid f(void (S::*)() const) {}
830e650017acdbbeb0c590e77bbea88c200ea1caefAnders Carlsson
8493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z1fM1SFvvE
850e650017acdbbeb0c590e77bbea88c200ea1caefAnders Carlssonvoid f(void (S::*)()) {}
86cf85b933fef4ce827df83ef2d22c322ab2078aa5Anders Carlsson
8793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z1fi
88cf85b933fef4ce827df83ef2d22c322ab2078aa5Anders Carlssonvoid f(const int) { }
89cf85b933fef4ce827df83ef2d22c322ab2078aa5Anders Carlsson
9003c9d530dbdcbb00b0b1ac0abced5dcce2e21408Anders Carlssontemplate<typename T, typename U> void ft1(U u, T t) { }
9103c9d530dbdcbb00b0b1ac0abced5dcce2e21408Anders Carlsson
9203c9d530dbdcbb00b0b1ac0abced5dcce2e21408Anders Carlssontemplate<typename T> void ft2(T t, void (*)(T), void (*)(T)) { }
939234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson
947624f219388f2434a4988ba2508a6ca7b57ba1c3Anders Carlssontemplate<typename T, typename U = S1<T> > struct S4 { };
957624f219388f2434a4988ba2508a6ca7b57ba1c3Anders Carlssontemplate<typename T> void ft3(S4<T>*) {  }
967624f219388f2434a4988ba2508a6ca7b57ba1c3Anders Carlsson
977482e247163978792654ca1a99913e19dd507e0aAnders Carlssonnamespace NS {
987482e247163978792654ca1a99913e19dd507e0aAnders Carlsson  template<typename T> void ft1(T) { }
997624f219388f2434a4988ba2508a6ca7b57ba1c3Anders Carlsson}
1007624f219388f2434a4988ba2508a6ca7b57ba1c3Anders Carlsson
101d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlssonvoid g1() {
10203c9d530dbdcbb00b0b1ac0abced5dcce2e21408Anders Carlsson  // CHECK: @_Z3ft1IidEvT0_T_
10303c9d530dbdcbb00b0b1ac0abced5dcce2e21408Anders Carlsson  ft1<int, double>(1, 0);
10403c9d530dbdcbb00b0b1ac0abced5dcce2e21408Anders Carlsson
10503c9d530dbdcbb00b0b1ac0abced5dcce2e21408Anders Carlsson  // CHECK: @_Z3ft2IcEvT_PFvS0_ES2_
10603c9d530dbdcbb00b0b1ac0abced5dcce2e21408Anders Carlsson  ft2<char>(1, 0, 0);
1077624f219388f2434a4988ba2508a6ca7b57ba1c3Anders Carlsson
1087624f219388f2434a4988ba2508a6ca7b57ba1c3Anders Carlsson  // CHECK: @_Z3ft3IiEvP2S4IT_2S1IS1_EE
1097624f219388f2434a4988ba2508a6ca7b57ba1c3Anders Carlsson  ft3<int>(0);
1107482e247163978792654ca1a99913e19dd507e0aAnders Carlsson
1117482e247163978792654ca1a99913e19dd507e0aAnders Carlsson  // CHECK: @_ZN2NS3ft1IiEEvT_
1127482e247163978792654ca1a99913e19dd507e0aAnders Carlsson  NS::ft1<int>(1);
1137482e247163978792654ca1a99913e19dd507e0aAnders Carlsson}
1147482e247163978792654ca1a99913e19dd507e0aAnders Carlsson
115d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlsson// Expressions
116d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlssontemplate<int I> struct S5 { };
117d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlsson
118d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlssontemplate<int I> void ft4(S5<I>) { }
119d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlssonvoid g2() {
120d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlsson  // CHECK: @_Z3ft4ILi10EEv2S5IXT_EE
121d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlsson  ft4(S5<10>());
122d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlsson
123d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlsson  // CHECK: @_Z3ft4ILi20EEv2S5IXT_EE
124d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlsson  ft4(S5<20>());
125d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlsson}
126d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073Anders Carlsson
1277482e247163978792654ca1a99913e19dd507e0aAnders Carlssonextern "C++" {
1287482e247163978792654ca1a99913e19dd507e0aAnders Carlsson  // CHECK: @_Z1hv
1297482e247163978792654ca1a99913e19dd507e0aAnders Carlsson void h() { }
130d58d6f778de936516d8815783f2e88348c41dce4Anders Carlsson}
1317482e247163978792654ca1a99913e19dd507e0aAnders Carlsson
1325cc58c6cfe4a6378287dbf92f9b1a23e133a6118Anders Carlsson// PR5019
1335cc58c6cfe4a6378287dbf92f9b1a23e133a6118Anders Carlssonextern "C" { struct a { int b; }; }
1345cc58c6cfe4a6378287dbf92f9b1a23e133a6118Anders Carlsson
1355cc58c6cfe4a6378287dbf92f9b1a23e133a6118Anders Carlsson// CHECK: @_Z1fP1a
1365cc58c6cfe4a6378287dbf92f9b1a23e133a6118Anders Carlssonint f(struct a *x) {
1375cc58c6cfe4a6378287dbf92f9b1a23e133a6118Anders Carlsson    return x->b;
1385cc58c6cfe4a6378287dbf92f9b1a23e133a6118Anders Carlsson}
139add28829c7a8d3c5da9ae140f18d3c9ad2d8b599Anders Carlsson
140add28829c7a8d3c5da9ae140f18d3c9ad2d8b599Anders Carlsson// PR5017
141add28829c7a8d3c5da9ae140f18d3c9ad2d8b599Anders Carlssonextern "C" {
142add28829c7a8d3c5da9ae140f18d3c9ad2d8b599Anders Carlssonstruct Debug {
1438257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson  const Debug& operator<< (unsigned a) const { return *this; }
144add28829c7a8d3c5da9ae140f18d3c9ad2d8b599Anders Carlsson};
145add28829c7a8d3c5da9ae140f18d3c9ad2d8b599Anders CarlssonDebug dbg;
146add28829c7a8d3c5da9ae140f18d3c9ad2d8b599Anders Carlsson// CHECK: @_ZNK5DebuglsEj
147add28829c7a8d3c5da9ae140f18d3c9ad2d8b599Anders Carlssonint main(void) {  dbg << 32 ;}
148add28829c7a8d3c5da9ae140f18d3c9ad2d8b599Anders Carlsson}
149ae3524866124021f3bc695886668254093c0793fAnders Carlsson
150ae3524866124021f3bc695886668254093c0793fAnders Carlssontemplate<typename T> struct S6 {
151ae3524866124021f3bc695886668254093c0793fAnders Carlsson  typedef int B;
152ae3524866124021f3bc695886668254093c0793fAnders Carlsson};
153ae3524866124021f3bc695886668254093c0793fAnders Carlsson
154ae3524866124021f3bc695886668254093c0793fAnders Carlssontemplate<typename T> void ft5(typename S6<T>::B) { }
155ae3524866124021f3bc695886668254093c0793fAnders Carlsson// CHECK: @_Z3ft5IiEvN2S6IT_E1BE
156ae3524866124021f3bc695886668254093c0793fAnders Carlssontemplate void ft5<int>(int);
1571668f2062b237ddb137f5d16388b3dea49651f85Anders Carlsson
1581668f2062b237ddb137f5d16388b3dea49651f85Anders Carlssontemplate<typename T> class A {};
1591668f2062b237ddb137f5d16388b3dea49651f85Anders Carlsson
1601668f2062b237ddb137f5d16388b3dea49651f85Anders Carlssonnamespace NS {
1611668f2062b237ddb137f5d16388b3dea49651f85Anders Carlssontemplate<typename T> bool operator==(const A<T>&, const A<T>&) { return true; }
1621668f2062b237ddb137f5d16388b3dea49651f85Anders Carlsson}
1631668f2062b237ddb137f5d16388b3dea49651f85Anders Carlsson
164aeb85374e92619b8e4ce92ac6e30756b5053a137Anders Carlsson// CHECK: @_ZN2NSeqIcEEbRK1AIT_ES5_
1651668f2062b237ddb137f5d16388b3dea49651f85Anders Carlssontemplate bool NS::operator==(const ::A<char>&, const ::A<char>&);
1661668f2062b237ddb137f5d16388b3dea49651f85Anders Carlsson
1671668f2062b237ddb137f5d16388b3dea49651f85Anders Carlssonnamespace std {
1681668f2062b237ddb137f5d16388b3dea49651f85Anders Carlssontemplate<typename T> bool operator==(const A<T>&, const A<T>&) { return true; }
1691668f2062b237ddb137f5d16388b3dea49651f85Anders Carlsson}
1701668f2062b237ddb137f5d16388b3dea49651f85Anders Carlsson
1711668f2062b237ddb137f5d16388b3dea49651f85Anders Carlsson// CHECK: @_ZSteqIcEbRK1AIT_ES4_
1721668f2062b237ddb137f5d16388b3dea49651f85Anders Carlssontemplate bool std::operator==(const ::A<char>&, const ::A<char>&);
1731668f2062b237ddb137f5d16388b3dea49651f85Anders Carlsson
1740ccdf8d62cba2ad730001f133b6cc4836c42da83Anders Carlssonstruct S {
1750ccdf8d62cba2ad730001f133b6cc4836c42da83Anders Carlsson  typedef int U;
1760ccdf8d62cba2ad730001f133b6cc4836c42da83Anders Carlsson};
1770ccdf8d62cba2ad730001f133b6cc4836c42da83Anders Carlsson
1780ccdf8d62cba2ad730001f133b6cc4836c42da83Anders Carlssontemplate <typename T> typename T::U ft6(const T&) { return 0; }
1790ccdf8d62cba2ad730001f133b6cc4836c42da83Anders Carlsson
1800ccdf8d62cba2ad730001f133b6cc4836c42da83Anders Carlsson// CHECK: @_Z3ft6I1SENT_1UERKS1_
1810ccdf8d62cba2ad730001f133b6cc4836c42da83Anders Carlssontemplate int ft6<S>(const S&);
18250755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlsson
18320c0da7787c9a7d2529e42a4a91d777778595d74John Wiegleytemplate<typename> struct __is_scalar_type {
1842bcb984df975c75130f2320c935fae1143c2a5ccRichard Smith  enum { __value = 1 };
18550755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlsson};
18650755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlsson
18750755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlssontemplate<bool, typename> struct __enable_if { };
18850755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlsson
18950755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlssontemplate<typename T> struct __enable_if<true, T> {
19050755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlsson  typedef T __type;
19150755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlsson};
19250755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlsson
19350755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlsson// PR5063
19420c0da7787c9a7d2529e42a4a91d777778595d74John Wiegleytemplate<typename T> typename __enable_if<__is_scalar_type<T>::__value, void>::__type ft7() { }
19550755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlsson
19626a6ec7be5ad57aa380f62aa2c39cd073e22d9dcJohn McCall// CHECK: @_Z3ft7IiEN11__enable_ifIXsr16__is_scalar_typeIT_EE7__valueEvE6__typeEv
19750755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlssontemplate void ft7<int>();
19826a6ec7be5ad57aa380f62aa2c39cd073e22d9dcJohn McCall// CHECK: @_Z3ft7IPvEN11__enable_ifIXsr16__is_scalar_typeIT_EE7__valueEvE6__typeEv
19950755b0dcc81eed9dcf27abe9162527013f26bd4Anders Carlssontemplate void ft7<void*>();
200b217c1b9d2225521f4021984ad5a424784fa22bbAnders Carlsson
201b217c1b9d2225521f4021984ad5a424784fa22bbAnders Carlsson// PR5144
202b217c1b9d2225521f4021984ad5a424784fa22bbAnders Carlssonextern "C" {
203b217c1b9d2225521f4021984ad5a424784fa22bbAnders Carlssonvoid extern_f(void);
204b217c1b9d2225521f4021984ad5a424784fa22bbAnders Carlsson};
205b217c1b9d2225521f4021984ad5a424784fa22bbAnders Carlsson
206b217c1b9d2225521f4021984ad5a424784fa22bbAnders Carlsson// CHECK: @extern_f
207b217c1b9d2225521f4021984ad5a424784fa22bbAnders Carlssonvoid extern_f(void) { }
208b217c1b9d2225521f4021984ad5a424784fa22bbAnders Carlsson
209c4355b6883382b85cda3b7337587784dabf3450bAnders Carlssonstruct S7 {
2105c478cf2d54157062cd843737324e0d0df03a464Anders Carlsson  S7();
211c4355b6883382b85cda3b7337587784dabf3450bAnders Carlsson
2125c478cf2d54157062cd843737324e0d0df03a464Anders Carlsson  struct S { S(); };
213c4355b6883382b85cda3b7337587784dabf3450bAnders Carlsson  struct {
214c4355b6883382b85cda3b7337587784dabf3450bAnders Carlsson    S s;
215c4355b6883382b85cda3b7337587784dabf3450bAnders Carlsson  } a;
216c4355b6883382b85cda3b7337587784dabf3450bAnders Carlsson};
217c4355b6883382b85cda3b7337587784dabf3450bAnders Carlsson
218c4355b6883382b85cda3b7337587784dabf3450bAnders Carlsson// PR5139
219c4355b6883382b85cda3b7337587784dabf3450bAnders Carlsson// CHECK: @_ZN2S7C2Ev
22066cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie// CHECK: @_ZN2S7Ut_C1Ev
221651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: @_ZN2S7C1Ev
222c4355b6883382b85cda3b7337587784dabf3450bAnders CarlssonS7::S7() {}
223c4355b6883382b85cda3b7337587784dabf3450bAnders Carlsson
224a7694087e4abaea261918ffbb3ffe38feb1da489Anders Carlsson// PR5063
22520c0da7787c9a7d2529e42a4a91d777778595d74John Wiegleytemplate<typename T> typename __enable_if<(__is_scalar_type<T>::__value), void>::__type ft8() { }
22626a6ec7be5ad57aa380f62aa2c39cd073e22d9dcJohn McCall// CHECK: @_Z3ft8IiEN11__enable_ifIXsr16__is_scalar_typeIT_EE7__valueEvE6__typeEv
227a7694087e4abaea261918ffbb3ffe38feb1da489Anders Carlssontemplate void ft8<int>();
22826a6ec7be5ad57aa380f62aa2c39cd073e22d9dcJohn McCall// CHECK: @_Z3ft8IPvEN11__enable_ifIXsr16__is_scalar_typeIT_EE7__valueEvE6__typeEv
229a7694087e4abaea261918ffbb3ffe38feb1da489Anders Carlssontemplate void ft8<void*>();
230e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson
23158040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlsson// PR5796
23258040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlssonnamespace PR5796 {
23320c0da7787c9a7d2529e42a4a91d777778595d74John Wiegleytemplate<typename> struct __is_scalar_type {
2342bcb984df975c75130f2320c935fae1143c2a5ccRichard Smith  enum { __value = 0 };
23558040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlsson};
23658040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlsson
23758040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlssontemplate<bool, typename> struct __enable_if {};
23858040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlssontemplate<typename T> struct __enable_if<true, T> { typedef T __type; };
23958040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlssontemplate<typename T>
24058040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlsson
24193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define linkonce_odr void @_ZN6PR57968__fill_aIiEENS_11__enable_ifIXntsr16__is_scalar_typeIT_EE7__valueEvE6__typeEv
24220c0da7787c9a7d2529e42a4a91d777778595d74John Wiegleytypename __enable_if<!__is_scalar_type<T>::__value, void>::__type __fill_a() { };
24358040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlsson
24458040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlssonvoid f() { __fill_a<int>(); }
24558040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlsson}
24658040a5ee50bcaebbcbebe47fbdc5fd70be90e83Anders Carlsson
247e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlssonnamespace Expressions {
248e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson// Unary operators.
249e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson
25093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define weak_odr void @_ZN11Expressions2f1ILi1EEEvPAplngT_Li2E_i
251e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlssontemplate <int i> void f1(int (*)[(-i) + 2]) { };
252e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlssontemplate void f1<1>(int (*)[1]);
253e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson
25493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define weak_odr void @_ZN11Expressions2f2ILi1EEEvPApsT__i
255e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlssontemplate <int i> void f2(int (*)[+i]) { };
256e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlssontemplate void f2<1>(int (*)[1]);
257e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson
258e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson// Binary operators.
259e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson
26093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define weak_odr void @_ZN11Expressions2f3ILi1EEEvPAplT_T__i
261e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlssontemplate <int i> void f3(int (*)[i+i]) { };
262e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlssontemplate void f3<1>(int (*)[2]);
263e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson
26493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define weak_odr void @_ZN11Expressions2f4ILi1EEEvPAplplLi2ET_T__i
265e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlssontemplate <int i> void f4(int (*)[2 + i+i]) { };
266e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlssontemplate void f4<1>(int (*)[4]);
267e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson
268e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson// The ternary operator.
26993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define weak_odr void @_ZN11Expressions2f4ILb1EEEvPAquT_Li1ELi2E_i
270e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlssontemplate <bool b> void f4(int (*)[b ? 1 : 2]) { };
271e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlssontemplate void f4<true>(int (*)[1]);
272e170ba7846bc4cae4b376b52eb4448645c141e59Anders Carlsson}
2738257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson
2748257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlssonstruct Ops {
2758257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson  Ops& operator+(const Ops&);
2768257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson  Ops& operator-(const Ops&);
2778257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson  Ops& operator&(const Ops&);
2788257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson  Ops& operator*(const Ops&);
2798257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson
2808257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson  void *v;
2818257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson};
2828257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson
283ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-LABEL: define nonnull %struct.Ops* @_ZN3OpsplERKS_
2848257d411a759b91921681c3b7f79e50e0d9252dbAnders CarlssonOps& Ops::operator+(const Ops&) { return *this; }
285ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-LABEL: define nonnull %struct.Ops* @_ZN3OpsmiERKS_
2868257d411a759b91921681c3b7f79e50e0d9252dbAnders CarlssonOps& Ops::operator-(const Ops&) { return *this; }
287ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-LABEL: define nonnull %struct.Ops* @_ZN3OpsanERKS_
2888257d411a759b91921681c3b7f79e50e0d9252dbAnders CarlssonOps& Ops::operator&(const Ops&) { return *this; }
289ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-LABEL: define nonnull %struct.Ops* @_ZN3OpsmlERKS_
2908257d411a759b91921681c3b7f79e50e0d9252dbAnders CarlssonOps& Ops::operator*(const Ops&) { return *this; }
2918257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson
2929e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlsson// PR5861
2939e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlssonnamespace PR5861 {
2949e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlssontemplate<bool> class P;
2959e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlssontemplate<> class P<true> {};
2969e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlsson
2979e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlssontemplate<template <bool> class, bool>
2989e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlssonstruct Policy { };
2999e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlsson
3009e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlssontemplate<typename T, typename = Policy<P, true> > class Alloc
3019e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlsson{
3029e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlsson  T *allocate(int, const void*) { return 0; }
3039e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlsson};
3049e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlsson
30593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define weak_odr i8* @_ZN6PR58615AllocIcNS_6PolicyINS_1PELb1EEEE8allocateEiPKv
3069e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlssontemplate class Alloc<char>;
3079e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlsson}
308f28c687866aed1ed7b4b9ddf44a51673861236cfAnders Carlsson
30993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z1fU13block_pointerFiiiE
310a9efbf009468f36df0bb66551677339055757d51Nuno Lopesvoid f(int (^)(int, int)) { }
311a9efbf009468f36df0bb66551677339055757d51Nuno Lopes
31231455256ae26cc7069111643ec4429ea564377daSean Huntvoid pr5966_foo() {
31331455256ae26cc7069111643ec4429ea564377daSean Hunt  extern int pr5966_i;
31431455256ae26cc7069111643ec4429ea564377daSean Hunt  pr5966_i = 0;
31531455256ae26cc7069111643ec4429ea564377daSean Hunt}
31631455256ae26cc7069111643ec4429ea564377daSean Hunt
317a41c97a5d1912ffd184381d269fd8e5a25ee5e59Richard Smithstatic int pr5966_j;
31831455256ae26cc7069111643ec4429ea564377daSean Hunt
31931455256ae26cc7069111643ec4429ea564377daSean Huntvoid pr5966_bar() {
320a41c97a5d1912ffd184381d269fd8e5a25ee5e59Richard Smith  pr5966_j = 0;
32131455256ae26cc7069111643ec4429ea564377daSean Hunt}
3221dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall
3231dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCallnamespace test0 {
3241dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall  int ovl(int x);
3251dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall  char ovl(double x);
3261dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall
3271dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall  template <class T> void f(T, char (&buffer)[sizeof(ovl(T()))]) {}
3281dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall
3291dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall  void test0() {
3301dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall    char buffer[1];
3311dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall    f(0.0, buffer);
3321dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall  }
33393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN5test05test0Ev()
33493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define linkonce_odr void @_ZN5test01fIdEEvT_RAszcl3ovlcvS1__EE_c(
3351dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall
3361dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall  void test1() {
3371dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall    char buffer[sizeof(int)];
3381dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall    f(1, buffer);
3391dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall  }
34093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN5test05test1Ev()
34193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define linkonce_odr void @_ZN5test01fIiEEvT_RAszcl3ovlcvS1__EE_c(
3421dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall
3431dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall  template <class T> void g(char (&buffer)[sizeof(T() + 5.0f)]) {}
3441dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall  void test2() {
3451dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall    char buffer[sizeof(float)];
3461dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall    g<float>(buffer);
3471dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall  }
34893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define linkonce_odr void @_ZN5test01gIfEEvRAszplcvT__ELf40a00000E_c(
3491dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall
3501dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall  template <class T> void h(char (&buffer)[sizeof(T() + 5.0)]) {}
3511dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall  void test3() {
3521dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall    char buffer[sizeof(double)];
3531dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall    h<float>(buffer);
3541dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall  }
35593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define linkonce_odr void @_ZN5test01hIfEEvRAszplcvT__ELd4014000000000000E_c(
3562f27bf854f0519810b34afd209089cc75536b757John McCall
3572f27bf854f0519810b34afd209089cc75536b757John McCall  template <class T> void j(char (&buffer)[sizeof(T().buffer)]) {}
3582f27bf854f0519810b34afd209089cc75536b757John McCall  struct A { double buffer[128]; };
3592f27bf854f0519810b34afd209089cc75536b757John McCall  void test4() {
3602f27bf854f0519810b34afd209089cc75536b757John McCall    char buffer[1024];
3612f27bf854f0519810b34afd209089cc75536b757John McCall    j<A>(buffer);
3622f27bf854f0519810b34afd209089cc75536b757John McCall  }
36393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define linkonce_odr void @_ZN5test01jINS_1AEEEvRAszdtcvT__E6buffer_c(
3640c8731a2724e1aee3b908dcfd589a89d4b7938e9John McCall
3650c8731a2724e1aee3b908dcfd589a89d4b7938e9John McCall  template <class T> void k(char (&buffer)[sizeof(T() + 0.0f)]) {}
3660c8731a2724e1aee3b908dcfd589a89d4b7938e9John McCall  void test5() {
3670c8731a2724e1aee3b908dcfd589a89d4b7938e9John McCall    char buffer[sizeof(float)];
3680c8731a2724e1aee3b908dcfd589a89d4b7938e9John McCall    k<float>(buffer);
3690c8731a2724e1aee3b908dcfd589a89d4b7938e9John McCall  }
37093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define linkonce_odr void @_ZN5test01kIfEEvRAszplcvT__ELf00000000E_c(
3710c8731a2724e1aee3b908dcfd589a89d4b7938e9John McCall
3721dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall}
37332fb4e1fd1cbd2ff006cc0e06c997e4eea2f0e28Douglas Gregor
37432fb4e1fd1cbd2ff006cc0e06c997e4eea2f0e28Douglas Gregornamespace test1 {
37532fb4e1fd1cbd2ff006cc0e06c997e4eea2f0e28Douglas Gregor  template<typename T> struct X { };
37632fb4e1fd1cbd2ff006cc0e06c997e4eea2f0e28Douglas Gregor  template<template<class> class Y, typename T> void f(Y<T>) { }
37793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN5test11fINS_1XEiEEvT_IT0_E
37832fb4e1fd1cbd2ff006cc0e06c997e4eea2f0e28Douglas Gregor  template void f(X<int>);
37932fb4e1fd1cbd2ff006cc0e06c997e4eea2f0e28Douglas Gregor}
380aec2523ab2c91413ef2f66dc944d0d6ac6a58abeAnders Carlsson
38193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define internal void @_ZL27functionWithInternalLinkagev()
382aec2523ab2c91413ef2f66dc944d0d6ac6a58abeAnders Carlssonstatic void functionWithInternalLinkage() {  }
383aec2523ab2c91413ef2f66dc944d0d6ac6a58abeAnders Carlssonvoid g() { functionWithInternalLinkage(); }
384ad5e73887052193afda72db8efcb812bd083a4a8John McCall
385ad5e73887052193afda72db8efcb812bd083a4a8John McCallnamespace test2 {
386ad5e73887052193afda72db8efcb812bd083a4a8John McCall  template <class T> decltype(((T*) 0)->member) read_member(T& obj) {
387ad5e73887052193afda72db8efcb812bd083a4a8John McCall    return obj.member;
388ad5e73887052193afda72db8efcb812bd083a4a8John McCall  }
389ad5e73887052193afda72db8efcb812bd083a4a8John McCall
390ad5e73887052193afda72db8efcb812bd083a4a8John McCall  struct A { int member; } obj;
391ad5e73887052193afda72db8efcb812bd083a4a8John McCall  int test() {
392ad5e73887052193afda72db8efcb812bd083a4a8John McCall    return read_member(obj);
393ad5e73887052193afda72db8efcb812bd083a4a8John McCall  }
394ad5e73887052193afda72db8efcb812bd083a4a8John McCall
39593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define linkonce_odr i32 @_ZN5test211read_memberINS_1AEEEDtptcvPT_Li0E6memberERS2_(
396ad5e73887052193afda72db8efcb812bd083a4a8John McCall}
397ad5e73887052193afda72db8efcb812bd083a4a8John McCall
398a0ce15c13a69c430d8980a1fcf03f420855c18caJohn McCall// rdar://problem/9280586
399ad5e73887052193afda72db8efcb812bd083a4a8John McCallnamespace test3 {
400ad5e73887052193afda72db8efcb812bd083a4a8John McCall  struct AmbiguousBase { int ab; };
401ad5e73887052193afda72db8efcb812bd083a4a8John McCall  struct Path1 : AmbiguousBase { float p; };
402ad5e73887052193afda72db8efcb812bd083a4a8John McCall  struct Path2 : AmbiguousBase { double p; };
403ad5e73887052193afda72db8efcb812bd083a4a8John McCall  struct Derived : Path1, Path2 { };
404ad5e73887052193afda72db8efcb812bd083a4a8John McCall
40593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define linkonce_odr i32 @_ZN5test38get_ab_1INS_7DerivedEEEDtptcvPT_Li0Esr5Path1E2abERS2_(
406a0ce15c13a69c430d8980a1fcf03f420855c18caJohn McCall  template <class T> decltype(((T*) 0)->Path1::ab) get_ab_1(T &ref) { return ref.Path1::ab; }
407ad5e73887052193afda72db8efcb812bd083a4a8John McCall
40893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define linkonce_odr i32 @_ZN5test38get_ab_2INS_7DerivedEEEDtptcvPT_Li0Esr5Path2E2abERS2_(
409a0ce15c13a69c430d8980a1fcf03f420855c18caJohn McCall  template <class T> decltype(((T*) 0)->Path2::ab) get_ab_2(T &ref) { return ref.Path2::ab; }
410a0ce15c13a69c430d8980a1fcf03f420855c18caJohn McCall
41193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define linkonce_odr float @_ZN5test37get_p_1INS_7DerivedEEEDtptcvPT_Li0Esr5Path1E1pERS2_(
412ad5e73887052193afda72db8efcb812bd083a4a8John McCall  template <class T> decltype(((T*) 0)->Path1::p) get_p_1(T &ref) { return ref.Path1::p; }
413ad5e73887052193afda72db8efcb812bd083a4a8John McCall
41493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define linkonce_odr double @_ZN5test37get_p_2INS_7DerivedEEEDtptcvPT_Li0Esr5Path2E1pERS2_(
415ad5e73887052193afda72db8efcb812bd083a4a8John McCall  template <class T> decltype(((T*) 0)->Path2::p) get_p_2(T &ref) { return ref.Path2::p; }
416ad5e73887052193afda72db8efcb812bd083a4a8John McCall
417ad5e73887052193afda72db8efcb812bd083a4a8John McCall  Derived obj;
418ad5e73887052193afda72db8efcb812bd083a4a8John McCall  void test() {
419a0ce15c13a69c430d8980a1fcf03f420855c18caJohn McCall    get_ab_1(obj);
420a0ce15c13a69c430d8980a1fcf03f420855c18caJohn McCall    get_ab_2(obj);
421ad5e73887052193afda72db8efcb812bd083a4a8John McCall    get_p_1(obj);
422ad5e73887052193afda72db8efcb812bd083a4a8John McCall    get_p_2(obj);
423ad5e73887052193afda72db8efcb812bd083a4a8John McCall  }
424ad5e73887052193afda72db8efcb812bd083a4a8John McCall}
425d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola
42693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_ZN5test41gEPNS_3zedIXadL_ZNS_3foo3barEEEEE
427d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindolanamespace test4 {
428d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  struct foo { int bar; };
429d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  template <int (foo::*)>
430d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  struct zed {};
431d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  void g(zed<&foo::bar>*)
432d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  {}
433d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola}
43493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_ZN5test51gEPNS_3zedIXadL_ZNS_3foo3barEEEEE
435d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindolanamespace test5 {
436d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  struct foo { static int bar; };
437d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  template <int *>
438d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  struct zed {};
439d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  void g(zed<&foo::bar>*)
440d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  {}
441d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola}
44293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_ZN5test61gEPNS_3zedIXadL_ZNS_3foo3barEvEEEE
443d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindolanamespace test6 {
444d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  struct foo { int bar(); };
445d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  template <int (foo::*)()>
446d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  struct zed {};
447d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  void g(zed<&foo::bar>*)
448d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  {}
449d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola}
45093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_ZN5test71gEPNS_3zedIXadL_ZNS_3foo3barEvEEEE
451d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindolanamespace test7 {
452d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  struct foo { static int bar(); };
453d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  template <int (*f)()>
454d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  struct zed {};
455d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  void g(zed<&foo::bar>*)
456d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  {}
457d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola}
45893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define weak_odr void @_ZN5test81AILZNS_1B5valueEEE3incEv
459d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindolanamespace test8 {
460d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  template <int &counter> class A { void inc() { counter++; } };
4617002f4c03c2d0544f4e8bea8d3a5636519081e35John McCall  class B { public: static int value; };
462d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola  template class A<B::value>;
463d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola}
4649b35b25db3641dfa8876d24b41cfa5b4d51477cbRafael Espindola// CHECK: declare void @_ZN5test91fIiNS_3barEEEvRKNT0_3baz1XE
4659b35b25db3641dfa8876d24b41cfa5b4d51477cbRafael Espindolanamespace test9 {
4669b35b25db3641dfa8876d24b41cfa5b4d51477cbRafael Espindola  template<class T>
4679b35b25db3641dfa8876d24b41cfa5b4d51477cbRafael Espindola  struct foo {
4689b35b25db3641dfa8876d24b41cfa5b4d51477cbRafael Espindola    typedef T X;
4699b35b25db3641dfa8876d24b41cfa5b4d51477cbRafael Espindola  };
4709b35b25db3641dfa8876d24b41cfa5b4d51477cbRafael Espindola  struct bar {
4719b35b25db3641dfa8876d24b41cfa5b4d51477cbRafael Espindola    typedef foo<int> baz;
4729b35b25db3641dfa8876d24b41cfa5b4d51477cbRafael Espindola  };
4739b35b25db3641dfa8876d24b41cfa5b4d51477cbRafael Espindola  template <class zaz, class zed>
4749b35b25db3641dfa8876d24b41cfa5b4d51477cbRafael Espindola  void f(const typename zed::baz::X&);
4759b35b25db3641dfa8876d24b41cfa5b4d51477cbRafael Espindola  void g() {
4769b35b25db3641dfa8876d24b41cfa5b4d51477cbRafael Espindola    f<int, bar>( 0);
4779b35b25db3641dfa8876d24b41cfa5b4d51477cbRafael Espindola  }
4789b35b25db3641dfa8876d24b41cfa5b4d51477cbRafael Espindola}
479de81063acdc999fbe1225f466ead12f7e9107acfJohn McCall
480de81063acdc999fbe1225f466ead12f7e9107acfJohn McCall// <rdar://problem/7825453>
481de81063acdc999fbe1225f466ead12f7e9107acfJohn McCallnamespace test10 {
482de81063acdc999fbe1225f466ead12f7e9107acfJohn McCall  template <char P1> struct S {};
483de81063acdc999fbe1225f466ead12f7e9107acfJohn McCall  template <char P2> void f(struct S<false ? 'a' : P2> ) {}
484de81063acdc999fbe1225f466ead12f7e9107acfJohn McCall
48593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN6test101fILc3EEEvNS_1SIXquLb0ELc97ET_EEE(
486de81063acdc999fbe1225f466ead12f7e9107acfJohn McCall  template void f<(char) 3>(struct S<3>);
487de81063acdc999fbe1225f466ead12f7e9107acfJohn McCall}
48893296683a70eed2fae0b694748ed4cc51c53aef4Anders Carlsson
48993296683a70eed2fae0b694748ed4cc51c53aef4Anders Carlssonnamespace test11 {
49093296683a70eed2fae0b694748ed4cc51c53aef4Anders Carlsson  // CHECK: @_ZN6test111fEz
49193296683a70eed2fae0b694748ed4cc51c53aef4Anders Carlsson  void f(...) { }
49293296683a70eed2fae0b694748ed4cc51c53aef4Anders Carlsson
49393296683a70eed2fae0b694748ed4cc51c53aef4Anders Carlsson  struct A {
49493296683a70eed2fae0b694748ed4cc51c53aef4Anders Carlsson    void f(...);
49593296683a70eed2fae0b694748ed4cc51c53aef4Anders Carlsson  };
49693296683a70eed2fae0b694748ed4cc51c53aef4Anders Carlsson
49793296683a70eed2fae0b694748ed4cc51c53aef4Anders Carlsson  // CHECK: @_ZN6test111A1fEz
49893296683a70eed2fae0b694748ed4cc51c53aef4Anders Carlsson  void A::f(...) { }
49993296683a70eed2fae0b694748ed4cc51c53aef4Anders Carlsson}
500dfc0d1ff1af5b199945a1ff98a6f7db0fdfb1615Anders Carlsson
501dfc0d1ff1af5b199945a1ff98a6f7db0fdfb1615Anders Carlssonnamespace test12 {
502dfc0d1ff1af5b199945a1ff98a6f7db0fdfb1615Anders Carlsson
503dfc0d1ff1af5b199945a1ff98a6f7db0fdfb1615Anders Carlsson  // CHECK: _ZN6test121fENS_1AILt33000EEE
504dfc0d1ff1af5b199945a1ff98a6f7db0fdfb1615Anders Carlsson  template <unsigned short> struct A { };
505dfc0d1ff1af5b199945a1ff98a6f7db0fdfb1615Anders Carlsson  void f(A<33000>) { }
506b6f532e2b03dbbfd97a37a7bb845fe23f8136889John McCall}
507b6f532e2b03dbbfd97a37a7bb845fe23f8136889John McCall
508b6f532e2b03dbbfd97a37a7bb845fe23f8136889John McCall// PR7446
509b6f532e2b03dbbfd97a37a7bb845fe23f8136889John McCallnamespace test13 {
510b6f532e2b03dbbfd97a37a7bb845fe23f8136889John McCall  template <template <class> class T> class A {};
511b6f532e2b03dbbfd97a37a7bb845fe23f8136889John McCall  template <class U> class B {};
512b6f532e2b03dbbfd97a37a7bb845fe23f8136889John McCall
513b6f532e2b03dbbfd97a37a7bb845fe23f8136889John McCall  template <template<class> class T> void foo(const A<T> &a) {}
514b6f532e2b03dbbfd97a37a7bb845fe23f8136889John McCall
51593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN6test133fooINS_1BEEEvRKNS_1AIT_EE(
516b6f532e2b03dbbfd97a37a7bb845fe23f8136889John McCall  template void foo(const A<B> &a);
517b6f532e2b03dbbfd97a37a7bb845fe23f8136889John McCall}
518c00cb6409307846a9bbcd86d307a1a91aab659d0Eli Friedman
519c00cb6409307846a9bbcd86d307a1a91aab659d0Eli Friedmannamespace test14 {
520c00cb6409307846a9bbcd86d307a1a91aab659d0Eli Friedman  extern "C" {
521c00cb6409307846a9bbcd86d307a1a91aab659d0Eli Friedman    struct S {
522c00cb6409307846a9bbcd86d307a1a91aab659d0Eli Friedman      static int a(), x;
523c00cb6409307846a9bbcd86d307a1a91aab659d0Eli Friedman    };
52493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin    // CHECK-LABEL: define i32 @_ZN6test141S1aEv
525c00cb6409307846a9bbcd86d307a1a91aab659d0Eli Friedman    // CHECK: load i32* @_ZN6test141S1xE
526c00cb6409307846a9bbcd86d307a1a91aab659d0Eli Friedman    int S::a() { return S::x; }
527c00cb6409307846a9bbcd86d307a1a91aab659d0Eli Friedman  }
528c00cb6409307846a9bbcd86d307a1a91aab659d0Eli Friedman}
5293dc7e7b9c59b9a2ed4f530b32e710a3738611df7John McCall
5303dc7e7b9c59b9a2ed4f530b32e710a3738611df7John McCall// rdar://problem/8204122
5313dc7e7b9c59b9a2ed4f530b32e710a3738611df7John McCallnamespace test15 {
5323dc7e7b9c59b9a2ed4f530b32e710a3738611df7John McCall  enum E { e = 3 };
5333dc7e7b9c59b9a2ed4f530b32e710a3738611df7John McCall  template <int I> struct S {};
5343dc7e7b9c59b9a2ed4f530b32e710a3738611df7John McCall
5353dc7e7b9c59b9a2ed4f530b32e710a3738611df7John McCall  template <int I> void f(S<I + e>) {}
5363dc7e7b9c59b9a2ed4f530b32e710a3738611df7John McCall
53793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN6test151fILi7EEEvNS_1SIXplT_LNS_1EE3EEEE(
5383dc7e7b9c59b9a2ed4f530b32e710a3738611df7John McCall  template void f<7>(S<7 + e>);
5393dc7e7b9c59b9a2ed4f530b32e710a3738611df7John McCall}
5407121c8f551d9c91c0cf0e5e1f7f9aafa97241b17John McCall
5416f615bc52bd5513019c32b378834a3c1b8425bf8John McCall// rdar://problem/8302148
5426f615bc52bd5513019c32b378834a3c1b8425bf8John McCallnamespace test17 {
5436f615bc52bd5513019c32b378834a3c1b8425bf8John McCall  template <int N> struct A {};
5446f615bc52bd5513019c32b378834a3c1b8425bf8John McCall
5456f615bc52bd5513019c32b378834a3c1b8425bf8John McCall  struct B {
5466f615bc52bd5513019c32b378834a3c1b8425bf8John McCall    static int foo(void);
5476f615bc52bd5513019c32b378834a3c1b8425bf8John McCall  };
5486f615bc52bd5513019c32b378834a3c1b8425bf8John McCall
5496f615bc52bd5513019c32b378834a3c1b8425bf8John McCall  template <class T> A<sizeof(T::foo())> func(void);
5506f615bc52bd5513019c32b378834a3c1b8425bf8John McCall
55193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN6test174testEv()
5526f615bc52bd5513019c32b378834a3c1b8425bf8John McCall  // CHECK: call {{.*}} @_ZN6test174funcINS_1BEEENS_1AIXszclsrT_3fooEEEEv()
5536dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  void test() {
5546dbce19fdae4cfae4eb5f826284978e723a04e61John McCall    func<B>();
5556f615bc52bd5513019c32b378834a3c1b8425bf8John McCall  }
5566f615bc52bd5513019c32b378834a3c1b8425bf8John McCall}
5575e1e89b8af283af34943a477dc6378f1a641df26John McCall
5585e1e89b8af283af34943a477dc6378f1a641df26John McCall// PR7891
5595e1e89b8af283af34943a477dc6378f1a641df26John McCallnamespace test18 {
5605e1e89b8af283af34943a477dc6378f1a641df26John McCall  struct A {
5615e1e89b8af283af34943a477dc6378f1a641df26John McCall    int operator+();
5625e1e89b8af283af34943a477dc6378f1a641df26John McCall    int operator-();
5635e1e89b8af283af34943a477dc6378f1a641df26John McCall    int operator*();
5645e1e89b8af283af34943a477dc6378f1a641df26John McCall    int operator&();
5655e1e89b8af283af34943a477dc6378f1a641df26John McCall  };
5665e1e89b8af283af34943a477dc6378f1a641df26John McCall  template <int (A::*)()> struct S {};
5675e1e89b8af283af34943a477dc6378f1a641df26John McCall
5685e1e89b8af283af34943a477dc6378f1a641df26John McCall  template <typename T> void f(S<&T::operator+>) {}
5695e1e89b8af283af34943a477dc6378f1a641df26John McCall  template void f<A>(S<&A::operator+>);
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
58093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN6test181fINS_1AEEEvNS_1SIXadsrT_plEEE
58193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN6test181fINS_1AEEEvNS_1SIXadsrT_miEEE
58293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN6test181fINS_1AEEEvNS_1SIXadsrT_mlEEE
58393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN6test181fINS_1AEEEvNS_1SIXadsrT_anEEE
5845e1e89b8af283af34943a477dc6378f1a641df26John McCall}
5856dbce19fdae4cfae4eb5f826284978e723a04e61John McCall
5866dbce19fdae4cfae4eb5f826284978e723a04e61John McCall// rdar://problem/8332117
5876dbce19fdae4cfae4eb5f826284978e723a04e61John McCallnamespace test19 {
5886dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  struct A {
5896dbce19fdae4cfae4eb5f826284978e723a04e61John McCall    template <typename T> int f();
5906dbce19fdae4cfae4eb5f826284978e723a04e61John McCall    int operator+();
5916dbce19fdae4cfae4eb5f826284978e723a04e61John McCall    operator int();
5926dbce19fdae4cfae4eb5f826284978e723a04e61John McCall    template <typename T> int operator-();
5936dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  };
5946dbce19fdae4cfae4eb5f826284978e723a04e61John McCall
5956dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  template <int (A::*)()> struct S {};
5966dbce19fdae4cfae4eb5f826284978e723a04e61John McCall
5976dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  template <typename T> void g (S<&T::template f<int> >) {}
5986dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  template <typename T> void g (S<&T::operator+ >) {}
5996dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  template <typename T> void g (S<&T::operator int>) {}
6006dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  template <typename T> void g (S<&T::template operator- <double> >) {}
6016dbce19fdae4cfae4eb5f826284978e723a04e61John McCall
60293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN6test191gINS_1AEEEvNS_1SIXadsrT_1fIiEEEE(
6036dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  template void g<A>(S<&A::f<int> >);
60493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN6test191gINS_1AEEEvNS_1SIXadsrT_plEEE(
6056dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  template void g<A>(S<&A::operator+>);
60693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN6test191gINS_1AEEEvNS_1SIXadsrT_cviEEE(
6076dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  template void g<A>(S<&A::operator int>);
60893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN6test191gINS_1AEEEvNS_1SIXadsrT_miIdEEEE(
6096dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  template void g<A>(S<&A::operator-<double> >);
6106dbce19fdae4cfae4eb5f826284978e723a04e61John McCall}
6116dbce19fdae4cfae4eb5f826284978e723a04e61John McCall
6126dbce19fdae4cfae4eb5f826284978e723a04e61John McCallnamespace test20 {
6136dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  template <class T> T *f(const T&);
6146dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  template <class T> T *f(T*);
6156dbce19fdae4cfae4eb5f826284978e723a04e61John McCall
61693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN6test205test0IiEEvDTcl1fIPT_ELi0EEE(
6176dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  template <class T> void test0(decltype(f<T*>(0))) {}
6186dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  template void test0<int>(decltype(f<int*>(0)));
6196dbce19fdae4cfae4eb5f826284978e723a04e61John McCall
62093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN6test205test1IiEEvDTcl1fIEcvT__EEE(
6216dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  template <class T> void test1(decltype(f<>(T()))) {}
6226dbce19fdae4cfae4eb5f826284978e723a04e61John McCall  template void test1<int>(decltype(f<>(int())));
6236dbce19fdae4cfae4eb5f826284978e723a04e61John McCall}
6247281d1fbea62a4549b045bb7dc434904f2b609d8Fariborz Jahanian
6257281d1fbea62a4549b045bb7dc434904f2b609d8Fariborz Jahanian// rdar:// 8620510
6267281d1fbea62a4549b045bb7dc434904f2b609d8Fariborz Jahaniannamespace test21 {
62793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN6test2112vla_arg_funcEiPA_i(
6287281d1fbea62a4549b045bb7dc434904f2b609d8Fariborz Jahanian  void vla_arg_func(int X, int a[X][X]) {}
6297281d1fbea62a4549b045bb7dc434904f2b609d8Fariborz Jahanian}
630e292368afa63337f5ff64c967857a898d6f868daAnders Carlsson
631e292368afa63337f5ff64c967857a898d6f868daAnders Carlssonnamespace test22 {
63293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN6test221fEDn(
633e292368afa63337f5ff64c967857a898d6f868daAnders Carlsson  void f(decltype(nullptr)) { }
634e292368afa63337f5ff64c967857a898d6f868daAnders Carlsson}
635b47f74818094fabd8f150fb4d6d0fa8a6c52cde1John McCall
636b47f74818094fabd8f150fb4d6d0fa8a6c52cde1John McCall// rdar://problem/8913416
637b47f74818094fabd8f150fb4d6d0fa8a6c52cde1John McCallnamespace test23 {
638b47f74818094fabd8f150fb4d6d0fa8a6c52cde1John McCall  typedef void * const vpc;
639b47f74818094fabd8f150fb4d6d0fa8a6c52cde1John McCall
64093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN6test231fERA10_KPv(
641b47f74818094fabd8f150fb4d6d0fa8a6c52cde1John McCall  void f(vpc (&)[10]) {}
642b47f74818094fabd8f150fb4d6d0fa8a6c52cde1John McCall
643b47f74818094fabd8f150fb4d6d0fa8a6c52cde1John McCall  typedef vpc vpca5[5];
644b47f74818094fabd8f150fb4d6d0fa8a6c52cde1John McCall  void f(vpca5 volatile (&)[10]) {}
64593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN6test231fERA10_A5_VKPv(
646b47f74818094fabd8f150fb4d6d0fa8a6c52cde1John McCall}
64774990f45b0bc57fca81f908efb13d2b6c6350f03John McCall
64874990f45b0bc57fca81f908efb13d2b6c6350f03John McCallnamespace test24 {
64974990f45b0bc57fca81f908efb13d2b6c6350f03John McCall  void test0() {
65074990f45b0bc57fca81f908efb13d2b6c6350f03John McCall    extern int foo();
65174990f45b0bc57fca81f908efb13d2b6c6350f03John McCall    // CHECK: call i32 @_ZN6test243fooEv()
65274990f45b0bc57fca81f908efb13d2b6c6350f03John McCall    foo();
65374990f45b0bc57fca81f908efb13d2b6c6350f03John McCall  }
65474990f45b0bc57fca81f908efb13d2b6c6350f03John McCall
655a41c97a5d1912ffd184381d269fd8e5a25ee5e59Richard Smith  static char bar() {}
65674990f45b0bc57fca81f908efb13d2b6c6350f03John McCall  void test1() {
657a41c97a5d1912ffd184381d269fd8e5a25ee5e59Richard Smith    // CHECK: call signext i8 @_ZN6test24L3barEv()
658a41c97a5d1912ffd184381d269fd8e5a25ee5e59Richard Smith    bar();
65974990f45b0bc57fca81f908efb13d2b6c6350f03John McCall  }
66074990f45b0bc57fca81f908efb13d2b6c6350f03John McCall}
661c0a455942453a37dd7db83eb354f40a49872ab06John McCall
662c0a455942453a37dd7db83eb354f40a49872ab06John McCall// rdar://problem/8806641
663c0a455942453a37dd7db83eb354f40a49872ab06John McCallnamespace test25 {
664c0a455942453a37dd7db83eb354f40a49872ab06John McCall  template <void (*fn)()> struct A {
665c0a455942453a37dd7db83eb354f40a49872ab06John McCall    static void call() { fn(); }
666c0a455942453a37dd7db83eb354f40a49872ab06John McCall  };
667c0a455942453a37dd7db83eb354f40a49872ab06John McCall  void foo();
668c0a455942453a37dd7db83eb354f40a49872ab06John McCall  void test() {
669c0a455942453a37dd7db83eb354f40a49872ab06John McCall    // CHECK: call void @_ZN6test251AIXadL_ZNS_3fooEvEEE4callEv()
670c0a455942453a37dd7db83eb354f40a49872ab06John McCall    A<foo>::call();
671c0a455942453a37dd7db83eb354f40a49872ab06John McCall  }
672c0a455942453a37dd7db83eb354f40a49872ab06John McCall}
6734f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall
6744f4e413f282609d4a488b44fc8669c28636a7abaJohn McCallnamespace test26 {
6754f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall  template <template <class> class T> void foo(decltype(T<float>::object) &object) {}
6764f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall
6774f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall  template <class T> struct holder { static T object; };
6784f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall
6794f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall  void test() {
6804f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall    float f;
6814f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall
6824f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall    // CHECK: call void @_ZN6test263fooINS_6holderEEEvRDtsrT_IfE6objectE(
6834f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall    foo<holder>(f);
6844f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall  }
6854f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall}
6864f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall
6874f4e413f282609d4a488b44fc8669c28636a7abaJohn McCallnamespace test27 {
6884f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall  struct A {
6894f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall    struct inner {
6904f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall      float object;
6914f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall    };
6924f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall
6934f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall    float meth();
6944f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall  };
6954f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall  typedef A Alias;
6964f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall
6974f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall  template <class T> void a(decltype(T::inner::object) &object) {}
6984f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall  template <class T> void b(decltype(T().Alias::meth()) &object) {}
6994f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall
7004f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall  void test() {
7014f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall    float f;
7024f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall    // CHECK: call void @_ZN6test271aINS_1AEEEvRDtsrNT_5innerE6objectE(
7034f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall    a<A>(f);
7044f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall    // CHECK: call void @_ZN6test271bINS_1AEEEvRDTcldtcvT__Esr5AliasE4methEE(
7054f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall    b<A>(f);
7064f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall  }
7074f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall}
708d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall
709d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall// An injected class name type in a unresolved-name.
710d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCallnamespace test28 {
711d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall  template <class T> struct A {
712d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall    enum { bit };
713d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall  };
714d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall
715d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall  template <class T> void foo(decltype(A<T>::A::bit) x);
716d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall
717d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall  void test() {
718d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall    foo<char>(A<char>::bit);
719d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall    // CHECK: call void @_ZN6test283fooIcEEvDtsr1AIT_E1AE3bitE(
720d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall  }
721d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall}
722d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall
723d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall// An enclosing template type parameter in an unresolved-name.
724d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCallnamespace test29 {
725d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall  template <class T> struct A {
726d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall    template <class U> static void foo(decltype(T::fn(U())) x);
727d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall  };
728d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall  struct B { static int fn(int); static long fn(long); };
729d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall
730d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall  void test() {
731d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall    A<B>::foo<int>(0);
732d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall    // CHECK: call void @_ZN6test291AINS_1BEE3fooIiEEvDTclsrS1_2fncvT__EEE(
733d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall  }
734d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall}
735d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall
736d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall// An enclosing template template parameter in an unresolved-name.
737d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCallnamespace test30 {
738d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall  template <template <class> class T> struct A {
739d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall    template <class U> static void foo(decltype(T<U>::fn()) x);
740d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall  };
741d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall  template <class T> struct B { static T fn(); };
742d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall
743d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall  void test() {
744d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall    A<B>::foo<int>(0);
74568a51a7f9c01ccbe7232d41beeb4deb26f40b013John McCall    // CHECK: call void @_ZN6test301AINS_1BEE3fooIiEEvDTclsrS1_IT_EE2fnEE(
746d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall  }
747d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall}
748561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor
749561f81243f665cf2001caadc45df505f826b72d6Douglas Gregornamespace test31 { // instantiation-dependent mangling of decltype
750561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  int x;
751561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  template<class T> auto f1(T p)->decltype(x) { return 0; }
752561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  // The return type in the mangling of the template signature
753561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  // is encoded as "i".
754561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  template<class T> auto f2(T p)->decltype(p) { return 0; }
755561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  // The return type in the mangling of the template signature
756561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  // is encoded as "Dtfp_E".
757561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  void g(int);
758561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  template<class T> auto f3(T p)->decltype(g(p)) {}
759561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor
76093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr i32 @_ZN6test312f1IiEEiT_(
761561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  template int f1(int);
76293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr i32 @_ZN6test312f2IiEEDtfp_ET_
763561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  template int f2(int);
76493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN6test312f3IiEEDTcl1gfp_EET_
765561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  template void f3(int);
766561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor}
76735ee32e800145a535f2676898f8f06f7ae6e9b43John McCall
76835ee32e800145a535f2676898f8f06f7ae6e9b43John McCall// PR10205
76935ee32e800145a535f2676898f8f06f7ae6e9b43John McCallnamespace test32 {
77035ee32e800145a535f2676898f8f06f7ae6e9b43John McCall  template<typename T, int=T::value> struct A {
77135ee32e800145a535f2676898f8f06f7ae6e9b43John McCall    typedef int type;
77235ee32e800145a535f2676898f8f06f7ae6e9b43John McCall  };
77335ee32e800145a535f2676898f8f06f7ae6e9b43John McCall  struct B { enum { value = 4 }; };
77435ee32e800145a535f2676898f8f06f7ae6e9b43John McCall
77535ee32e800145a535f2676898f8f06f7ae6e9b43John McCall  template <class T> typename A<T>::type foo() { return 0; }
77635ee32e800145a535f2676898f8f06f7ae6e9b43John McCall  void test() {
77735ee32e800145a535f2676898f8f06f7ae6e9b43John McCall    foo<B>();
77835ee32e800145a535f2676898f8f06f7ae6e9b43John McCall    // CHECK: call i32 @_ZN6test323fooINS_1BEEENS_1AIT_XsrS3_5valueEE4typeEv()
77935ee32e800145a535f2676898f8f06f7ae6e9b43John McCall  }
78035ee32e800145a535f2676898f8f06f7ae6e9b43John McCall}
78135ee32e800145a535f2676898f8f06f7ae6e9b43John McCall
78235ee32e800145a535f2676898f8f06f7ae6e9b43John McCallnamespace test33 {
78335ee32e800145a535f2676898f8f06f7ae6e9b43John McCall  template <class T> struct X {
78435ee32e800145a535f2676898f8f06f7ae6e9b43John McCall    enum { value = T::value };
78535ee32e800145a535f2676898f8f06f7ae6e9b43John McCall  };
78635ee32e800145a535f2676898f8f06f7ae6e9b43John McCall
78735ee32e800145a535f2676898f8f06f7ae6e9b43John McCall  template<typename T, int=X<T>::value> struct A {
78835ee32e800145a535f2676898f8f06f7ae6e9b43John McCall    typedef int type;
78935ee32e800145a535f2676898f8f06f7ae6e9b43John McCall  };
79035ee32e800145a535f2676898f8f06f7ae6e9b43John McCall  struct B { enum { value = 4 }; };
79135ee32e800145a535f2676898f8f06f7ae6e9b43John McCall
79235ee32e800145a535f2676898f8f06f7ae6e9b43John McCall  template <class T> typename A<T>::type foo() { return 0; }
79335ee32e800145a535f2676898f8f06f7ae6e9b43John McCall
79435ee32e800145a535f2676898f8f06f7ae6e9b43John McCall  void test() {
79535ee32e800145a535f2676898f8f06f7ae6e9b43John McCall    foo<B>();
79635ee32e800145a535f2676898f8f06f7ae6e9b43John McCall    // CHECK: call i32 @_ZN6test333fooINS_1BEEENS_1AIT_Xsr1XIS3_EE5valueEE4typeEv()
79735ee32e800145a535f2676898f8f06f7ae6e9b43John McCall  }
79835ee32e800145a535f2676898f8f06f7ae6e9b43John McCall}
7995e78cd43a033b3dedf741fca4fa1652f9cb3e41cDouglas Gregor
8005e78cd43a033b3dedf741fca4fa1652f9cb3e41cDouglas Gregornamespace test34 {
801edee94b615059ad178b06a489312eca6e049609aDouglas Gregor  // Mangling for instantiation-dependent decltype expressions.
8025e78cd43a033b3dedf741fca4fa1652f9cb3e41cDouglas Gregor  template<typename T>
8035e78cd43a033b3dedf741fca4fa1652f9cb3e41cDouglas Gregor  void f(decltype(sizeof(decltype(T() + T())))) {}
8045e78cd43a033b3dedf741fca4fa1652f9cb3e41cDouglas Gregor
80593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN6test341fIiEEvDTstDTplcvT__EcvS1__EEE
8065e78cd43a033b3dedf741fca4fa1652f9cb3e41cDouglas Gregor  template void f<int>(decltype(sizeof(1)));
807edee94b615059ad178b06a489312eca6e049609aDouglas Gregor
808edee94b615059ad178b06a489312eca6e049609aDouglas Gregor  // Mangling for non-instantiation-dependent sizeof expressions.
809edee94b615059ad178b06a489312eca6e049609aDouglas Gregor  template<unsigned N>
810edee94b615059ad178b06a489312eca6e049609aDouglas Gregor  void f2(int (&)[N + sizeof(int*)]) {}
811edee94b615059ad178b06a489312eca6e049609aDouglas Gregor
81293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN6test342f2ILj4EEEvRAplT_Lm8E_i
813edee94b615059ad178b06a489312eca6e049609aDouglas Gregor  template void f2<4>(int (&)[4 + sizeof(int*)]);
814edee94b615059ad178b06a489312eca6e049609aDouglas Gregor
815edee94b615059ad178b06a489312eca6e049609aDouglas Gregor  // Mangling for non-instantiation-dependent sizeof expressions
816edee94b615059ad178b06a489312eca6e049609aDouglas Gregor  // involving an implicit conversion of the result of the sizeof.
817edee94b615059ad178b06a489312eca6e049609aDouglas Gregor  template<unsigned long long N>
818edee94b615059ad178b06a489312eca6e049609aDouglas Gregor  void f3(int (&)[N + sizeof(int*)]) {}
819edee94b615059ad178b06a489312eca6e049609aDouglas Gregor
82093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN6test342f3ILy4EEEvRAplT_Ly8E_i
821edee94b615059ad178b06a489312eca6e049609aDouglas Gregor  template void f3<4>(int (&)[4 + sizeof(int*)]);
822f1588660c109610e6a79c786b83b7c9bbd6ed31eDouglas Gregor
823f1588660c109610e6a79c786b83b7c9bbd6ed31eDouglas Gregor  // Mangling for instantiation-dependent sizeof() expressions as
824f1588660c109610e6a79c786b83b7c9bbd6ed31eDouglas Gregor  // template arguments.
825f1588660c109610e6a79c786b83b7c9bbd6ed31eDouglas Gregor  template<unsigned> struct A { };
826f1588660c109610e6a79c786b83b7c9bbd6ed31eDouglas Gregor
827f1588660c109610e6a79c786b83b7c9bbd6ed31eDouglas Gregor  template<typename T> void f4(::test34::A<sizeof(sizeof(decltype(T() + T())))>) { }
828f1588660c109610e6a79c786b83b7c9bbd6ed31eDouglas Gregor
82993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN6test342f4IiEEvNS_1AIXszstDTplcvT__EcvS2__EEEEE
830f1588660c109610e6a79c786b83b7c9bbd6ed31eDouglas Gregor  template void f4<int>(A<sizeof(sizeof(int))>);
8315e78cd43a033b3dedf741fca4fa1652f9cb3e41cDouglas Gregor}
8321961791626ab0ebbd8bf901a37476d527def4edbDouglas Gregor
8331961791626ab0ebbd8bf901a37476d527def4edbDouglas Gregornamespace test35 {
8341961791626ab0ebbd8bf901a37476d527def4edbDouglas Gregor  // Dependent operator names of unknown arity.
8351961791626ab0ebbd8bf901a37476d527def4edbDouglas Gregor  struct A {
8361961791626ab0ebbd8bf901a37476d527def4edbDouglas Gregor    template<typename U> A operator+(U) const;
8371961791626ab0ebbd8bf901a37476d527def4edbDouglas Gregor  };
8381961791626ab0ebbd8bf901a37476d527def4edbDouglas Gregor
8391961791626ab0ebbd8bf901a37476d527def4edbDouglas Gregor  template<typename T>
8401961791626ab0ebbd8bf901a37476d527def4edbDouglas Gregor  void f1(decltype(sizeof(&T::template operator+<int>))) {}
8411961791626ab0ebbd8bf901a37476d527def4edbDouglas Gregor
84293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN6test352f1INS_1AEEEvDTszadsrT_plIiEE
8431961791626ab0ebbd8bf901a37476d527def4edbDouglas Gregor  template void f1<A>(__SIZE_TYPE__);
8441961791626ab0ebbd8bf901a37476d527def4edbDouglas Gregor}
84591832368ef1c1158c4351bdccaa141dac818f04eDouglas Gregor
84691832368ef1c1158c4351bdccaa141dac818f04eDouglas Gregornamespace test36 {
84791832368ef1c1158c4351bdccaa141dac818f04eDouglas Gregor  template<unsigned> struct A { };
84891832368ef1c1158c4351bdccaa141dac818f04eDouglas Gregor
84991832368ef1c1158c4351bdccaa141dac818f04eDouglas Gregor  template<typename ...Types>
85091832368ef1c1158c4351bdccaa141dac818f04eDouglas Gregor  auto f1(Types... values) -> A<sizeof...(values)> { }
85191832368ef1c1158c4351bdccaa141dac818f04eDouglas Gregor
85291832368ef1c1158c4351bdccaa141dac818f04eDouglas Gregor  // CHECK: define weak_odr {{.*}} @_ZN6test362f1IJifEEENS_1AIXsZfp_EEEDpT_
85391832368ef1c1158c4351bdccaa141dac818f04eDouglas Gregor  template A<2> f1(int, float);
85491832368ef1c1158c4351bdccaa141dac818f04eDouglas Gregor}
85566cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie
85666cff7257698d5528632917d38f9a3037bb1506dDavid Blaikienamespace test37 {
85766cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie  struct foo {
85866cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie    struct {
85966cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie    } a;
86066cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie    typedef struct { } b;
86166cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie    typedef struct { } *c;
86266cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie    struct {
86366cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie    } d;
86466cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie  };
86566cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie  template<typename T> void func(T) { }
86666cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie  void test() {
86793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin    // CHECK-LABEL: define linkonce_odr void @_ZN6test374funcINS_3fooUt_EEEvT_
86866cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie    func(foo().a);
86993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin    // CHECK-LABEL: define linkonce_odr void @_ZN6test374funcINS_3fooUt0_EEEvT_
87066cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie    func(*foo::c());
87193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin    // CHECK-LABEL: define linkonce_odr void @_ZN6test374funcINS_3fooUt1_EEEvT_
87266cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie    func(foo().d);
87366cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie  }
87466cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie}
875f21107b95a65db82f3295fd166074b5a59dfb1a7Tanya Lattner
87693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z6ASfuncPU3AS3i
877f21107b95a65db82f3295fd166074b5a59dfb1a7Tanya Lattnervoid ASfunc(__attribute__((address_space(3))) int* x) {}
8785bbb0581cb62e019c2b92bdd5362ba93e84e826fRafael Espindola
8795bbb0581cb62e019c2b92bdd5362ba93e84e826fRafael Espindolanamespace test38 {
88093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define linkonce_odr void @_ZN6test384funcINS_3fooUt_EEEvT_
8815bbb0581cb62e019c2b92bdd5362ba93e84e826fRafael Espindola  typedef struct {
8825bbb0581cb62e019c2b92bdd5362ba93e84e826fRafael Espindola    struct {
8835bbb0581cb62e019c2b92bdd5362ba93e84e826fRafael Espindola    } a;
8845bbb0581cb62e019c2b92bdd5362ba93e84e826fRafael Espindola  } foo;
8855bbb0581cb62e019c2b92bdd5362ba93e84e826fRafael Espindola
8865bbb0581cb62e019c2b92bdd5362ba93e84e826fRafael Espindola  template <typename T> void func(T) {}
8875bbb0581cb62e019c2b92bdd5362ba93e84e826fRafael Espindola  void test() { func(foo().a); }
8885bbb0581cb62e019c2b92bdd5362ba93e84e826fRafael Espindola}
8895bbb0581cb62e019c2b92bdd5362ba93e84e826fRafael Espindola
8905bbb0581cb62e019c2b92bdd5362ba93e84e826fRafael Espindolanamespace test39 {
89193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define internal void @"_ZN6test394funcINS_3$_03$_1EEEvT_"
8925bbb0581cb62e019c2b92bdd5362ba93e84e826fRafael Espindola  typedef struct {
8935bbb0581cb62e019c2b92bdd5362ba93e84e826fRafael Espindola    struct {} a;
8945bbb0581cb62e019c2b92bdd5362ba93e84e826fRafael Espindola  } *foo;
8955bbb0581cb62e019c2b92bdd5362ba93e84e826fRafael Espindola  template<typename T> void func(T) {}
8965bbb0581cb62e019c2b92bdd5362ba93e84e826fRafael Espindola  void test(foo x) {
8975bbb0581cb62e019c2b92bdd5362ba93e84e826fRafael Espindola    func(x->a);
8985bbb0581cb62e019c2b92bdd5362ba93e84e826fRafael Espindola  }
8995bbb0581cb62e019c2b92bdd5362ba93e84e826fRafael Espindola}
9005e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman
9015e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedmannamespace test40 {
902ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: i32* {{.*}} @_ZZN6test401fEvE1a_0
9035e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman  void h(int&);
9045e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman  inline void f() {
9055e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman    if (0) {
9065e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman      static int a;
9075e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman    }
9085e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman    static int a;
9095e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman    h(a);
9105e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman  };
9115e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman  void g() { f(); }
9125e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman}
9139d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer
9149d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemernamespace test41 {
9159d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer  // CHECK: define linkonce_odr void @_ZN6test414funcINS_1XEEEvNS_3fooILi20ES1_EE
9169d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer  template <int i, class T> struct foo {
9179d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer    template <class T2 = T> friend void func(foo x) {}
9189d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer  };
9199d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer
9209d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer  struct X {};
9219d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer
9229d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer  void g() { func(foo<20, X>()); }
9239d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer}
9249d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer
9259d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemernamespace test42 {
9269d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer  // CHECK: define linkonce_odr void @_ZN6test424funcINS_1XEEEvNS_3fooILi20ES1_EE
9279d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer  template <int i, template <class> class T> struct foo {
9289d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer    template <template <class> class T2 = T> friend void func(foo x) {}
9299d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer  };
9309d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer
9319d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer  template <class V> struct X {
9329d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer  };
9339d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer
9349d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer  void g() { func(foo<20, X>()); }
9359d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer}
936885d8bf8d06ddaf79ffe45a96aaa42621db44241David Majnemer
937885d8bf8d06ddaf79ffe45a96aaa42621db44241David Majnemernamespace test43 {
938885d8bf8d06ddaf79ffe45a96aaa42621db44241David Majnemer  // CHECK-LABEL: define void @_ZN6test431gEPNS_3zedIXadL_ZNS_3fooUt_3barEEEEE
939885d8bf8d06ddaf79ffe45a96aaa42621db44241David Majnemer  struct foo { union { int bar; }; };
940885d8bf8d06ddaf79ffe45a96aaa42621db44241David Majnemer  template <int (foo::*)>
941885d8bf8d06ddaf79ffe45a96aaa42621db44241David Majnemer  struct zed {};
942885d8bf8d06ddaf79ffe45a96aaa42621db44241David Majnemer  void g(zed<&foo::bar>*)
943885d8bf8d06ddaf79ffe45a96aaa42621db44241David Majnemer  {}
944885d8bf8d06ddaf79ffe45a96aaa42621db44241David Majnemer}
94562e9370d9da9ee4f675da52d559a79c93c30642eDavid Majnemer
94662e9370d9da9ee4f675da52d559a79c93c30642eDavid Majnemernamespace test44 {
94762e9370d9da9ee4f675da52d559a79c93c30642eDavid Majnemer  struct foo { void bar() __restrict { }; } obj;
94862e9370d9da9ee4f675da52d559a79c93c30642eDavid Majnemer
94962e9370d9da9ee4f675da52d559a79c93c30642eDavid Majnemer  void f() {
95062e9370d9da9ee4f675da52d559a79c93c30642eDavid Majnemer    obj.bar();
95162e9370d9da9ee4f675da52d559a79c93c30642eDavid Majnemer  }
95262e9370d9da9ee4f675da52d559a79c93c30642eDavid Majnemer  // CHECK-LABEL: define linkonce_odr void @_ZN6test443foo3barEv(%"struct.test44::foo"* %this)
95362e9370d9da9ee4f675da52d559a79c93c30642eDavid Majnemer}
9546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
9556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace test45 {
9566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  struct S {
9576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    enum e {};
9586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  };
9596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template <typename T>
9606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  void f(enum T::e *) {}
9616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template void f<S>(S::e *);
9626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK-LABEL: define weak_odr void @_ZN6test451fINS_1SEEEvPTeNT_1eE(i32*)
9636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
9646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
9656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace test46 {
9666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  struct S {
9676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    struct s {};
9686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  };
9696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template <typename T>
9706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  void f(struct T::s *) {}
9716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template void f<S>(S::s *);
9726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK-LABEL: define weak_odr void @_ZN6test461fINS_1SEEEvPTsNT_1sE(%"struct.test46::S::s"*)
9736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
9746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
9756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace test47 {
9766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  struct S {
9776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    class c {};
9786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  };
9796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template <typename T>
9806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  void f(class T::c *) {}
9816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template void f<S>(S::c *);
9826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK-LABEL: define weak_odr void @_ZN6test471fINS_1SEEEvPTsNT_1cE(%"class.test47::S::c"*)
9836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
9846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
9856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace test48 {
9866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  struct S {
9876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    union u {};
9886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  };
9896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template <typename T>
9906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  void f(union T::u *) {}
9916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template void f<S>(S::u *);
9926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK-LABEL: define weak_odr void @_ZN6test481fINS_1SEEEvPTuNT_1uE(%"union.test48::S::u"*)
9936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
994