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 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 790e650017acdbbeb0c590e77bbea88c200ea1caefAnders Carlssonstruct S; 800e650017acdbbeb0c590e77bbea88c200ea1caefAnders Carlsson 819234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_Z1fM1SKFvvE 820e650017acdbbeb0c590e77bbea88c200ea1caefAnders Carlssonvoid f(void (S::*)() const) {} 830e650017acdbbeb0c590e77bbea88c200ea1caefAnders Carlsson 849234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: define void @_Z1fM1SFvvE 850e650017acdbbeb0c590e77bbea88c200ea1caefAnders Carlssonvoid f(void (S::*)()) {} 86cf85b933fef4ce827df83ef2d22c322ab2078aa5Anders Carlsson 879234b7ff2bb99479fb97d5faa181a55aacf28b78Anders Carlsson// CHECK: 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 2198e51a1f5da6ef4a1a168d14116c6eed3a578a263John McCall// CHECK: @_ZN2S7C1Ev 220c4355b6883382b85cda3b7337587784dabf3450bAnders Carlsson// CHECK: @_ZN2S7C2Ev 22166cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie// CHECK: @_ZN2S7Ut_C1Ev 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 24126a6ec7be5ad57aa380f62aa2c39cd073e22d9dcJohn McCall// CHECK: 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 2508f51a4f2d00b0abda3cde7f3828fb2e2b9beafb5Douglas Gregor// CHECK: 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 2548f51a4f2d00b0abda3cde7f3828fb2e2b9beafb5Douglas Gregor// CHECK: 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 2608f51a4f2d00b0abda3cde7f3828fb2e2b9beafb5Douglas Gregor// CHECK: 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 2648f51a4f2d00b0abda3cde7f3828fb2e2b9beafb5Douglas Gregor// CHECK: 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. 2698f51a4f2d00b0abda3cde7f3828fb2e2b9beafb5Douglas Gregor// CHECK: 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 2838257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson// CHECK: define %struct.Ops* @_ZN3OpsplERKS_ 2848257d411a759b91921681c3b7f79e50e0d9252dbAnders CarlssonOps& Ops::operator+(const Ops&) { return *this; } 2858257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson// CHECK: define %struct.Ops* @_ZN3OpsmiERKS_ 2868257d411a759b91921681c3b7f79e50e0d9252dbAnders CarlssonOps& Ops::operator-(const Ops&) { return *this; } 2878257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson// CHECK: define %struct.Ops* @_ZN3OpsanERKS_ 2888257d411a759b91921681c3b7f79e50e0d9252dbAnders CarlssonOps& Ops::operator&(const Ops&) { return *this; } 2898257d411a759b91921681c3b7f79e50e0d9252dbAnders Carlsson// CHECK: define %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 3058f51a4f2d00b0abda3cde7f3828fb2e2b9beafb5Douglas Gregor// CHECK: define weak_odr i8* @_ZN6PR58615AllocIcNS_6PolicyINS_1PELb1EEEE8allocateEiPKv 3069e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlssontemplate class Alloc<char>; 3079e85c743a4cefff7386764bba3f3f2cdbe5c06e2Anders Carlsson} 308f28c687866aed1ed7b4b9ddf44a51673861236cfAnders Carlsson 309f28c687866aed1ed7b4b9ddf44a51673861236cfAnders Carlsson// CHECK: 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 31731455256ae26cc7069111643ec4429ea564377daSean Huntstatic int pr5966_i; 31831455256ae26cc7069111643ec4429ea564377daSean Hunt 31931455256ae26cc7069111643ec4429ea564377daSean Huntvoid pr5966_bar() { 32031455256ae26cc7069111643ec4429ea564377daSean Hunt pr5966_i = 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 } 3331dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall // CHECK: define void @_ZN5test05test0Ev() 3341dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall // CHECK: 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 } 3401dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall // CHECK: define void @_ZN5test05test1Ev() 3411dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall // CHECK: 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 } 3481b6005285e234bc30698917b2d3abb2f1f98bc77John McCall // CHECK: 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 } 3551dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall // CHECK: 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 } 363e1e342f4a96f132d8d7e802284417bd520f9f4f8John McCall // CHECK: 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 } 3700c8731a2724e1aee3b908dcfd589a89d4b7938e9John McCall // CHECK: 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>) { } 3778f51a4f2d00b0abda3cde7f3828fb2e2b9beafb5Douglas Gregor // CHECK: define weak_odr void @_ZN5test11fINS_1XEiEEvT_IT0_E 37832fb4e1fd1cbd2ff006cc0e06c997e4eea2f0e28Douglas Gregor template void f(X<int>); 37932fb4e1fd1cbd2ff006cc0e06c997e4eea2f0e28Douglas Gregor} 380aec2523ab2c91413ef2f66dc944d0d6ac6a58abeAnders Carlsson 38174990f45b0bc57fca81f908efb13d2b6c6350f03John McCall// CHECK: 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 395ad5e73887052193afda72db8efcb812bd083a4a8John McCall // CHECK: 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 4054f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall // CHECK: 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 4084f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall // CHECK: 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 4114f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall // CHECK: 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 4144f4e413f282609d4a488b44fc8669c28636a7abaJohn McCall // CHECK: 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 426d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola// CHECK: 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} 434d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola// CHECK: 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} 442d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola// CHECK: 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} 450d9800728cc3e7f478eec4d4b19af5b808ac51942Rafael Espindola// CHECK: 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} 4588f51a4f2d00b0abda3cde7f3828fb2e2b9beafb5Douglas Gregor// CHECK: 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 485de81063acdc999fbe1225f466ead12f7e9107acfJohn McCall // CHECK: 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 515b6f532e2b03dbbfd97a37a7bb845fe23f8136889John McCall // CHECK: 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 }; 524c00cb6409307846a9bbcd86d307a1a91aab659d0Eli Friedman // CHECK: 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 5373dc7e7b9c59b9a2ed4f530b32e710a3738611df7John McCall // CHECK: 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 5516dbce19fdae4cfae4eb5f826284978e723a04e61John McCall // CHECK: 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 5805e1e89b8af283af34943a477dc6378f1a641df26John McCall // CHECK: define weak_odr void @_ZN6test181fINS_1AEEEvNS_1SIXadsrT_plEEE 5815e1e89b8af283af34943a477dc6378f1a641df26John McCall // CHECK: define weak_odr void @_ZN6test181fINS_1AEEEvNS_1SIXadsrT_miEEE 5825e1e89b8af283af34943a477dc6378f1a641df26John McCall // CHECK: define weak_odr void @_ZN6test181fINS_1AEEEvNS_1SIXadsrT_mlEEE 5835e1e89b8af283af34943a477dc6378f1a641df26John McCall // CHECK: 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 6026dbce19fdae4cfae4eb5f826284978e723a04e61John McCall // CHECK: define weak_odr void @_ZN6test191gINS_1AEEEvNS_1SIXadsrT_1fIiEEEE( 6036dbce19fdae4cfae4eb5f826284978e723a04e61John McCall template void g<A>(S<&A::f<int> >); 6046dbce19fdae4cfae4eb5f826284978e723a04e61John McCall // CHECK: define weak_odr void @_ZN6test191gINS_1AEEEvNS_1SIXadsrT_plEEE( 6056dbce19fdae4cfae4eb5f826284978e723a04e61John McCall template void g<A>(S<&A::operator+>); 6066dbce19fdae4cfae4eb5f826284978e723a04e61John McCall // CHECK: define weak_odr void @_ZN6test191gINS_1AEEEvNS_1SIXadsrT_cviEEE( 6076dbce19fdae4cfae4eb5f826284978e723a04e61John McCall template void g<A>(S<&A::operator int>); 6086dbce19fdae4cfae4eb5f826284978e723a04e61John McCall // CHECK: 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 6166dbce19fdae4cfae4eb5f826284978e723a04e61John McCall // CHECK: 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 6206dbce19fdae4cfae4eb5f826284978e723a04e61John McCall // CHECK: 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 { 6277281d1fbea62a4549b045bb7dc434904f2b609d8Fariborz Jahanian // CHECK: 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 { 632e292368afa63337f5ff64c967857a898d6f868daAnders Carlsson // CHECK: 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 640b47f74818094fabd8f150fb4d6d0fa8a6c52cde1John McCall // CHECK: 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]) {} 645b47f74818094fabd8f150fb4d6d0fa8a6c52cde1John McCall // CHECK: 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 65574990f45b0bc57fca81f908efb13d2b6c6350f03John McCall static char foo() {} 65674990f45b0bc57fca81f908efb13d2b6c6350f03John McCall void test1() { 65774990f45b0bc57fca81f908efb13d2b6c6350f03John McCall // CHECK: call signext i8 @_ZN6test24L3fooEv() 65874990f45b0bc57fca81f908efb13d2b6c6350f03John McCall foo(); 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 760561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor // CHECK: define weak_odr i32 @_ZN6test312f1IiEEiT_( 761561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor template int f1(int); 762561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor // CHECK: define weak_odr i32 @_ZN6test312f2IiEEDtfp_ET_ 763561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor template int f2(int); 764561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor // CHECK: 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 8055e78cd43a033b3dedf741fca4fa1652f9cb3e41cDouglas Gregor // CHECK: 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 812edee94b615059ad178b06a489312eca6e049609aDouglas Gregor // CHECK: 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 820edee94b615059ad178b06a489312eca6e049609aDouglas Gregor // CHECK: 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 829f1588660c109610e6a79c786b83b7c9bbd6ed31eDouglas Gregor // CHECK: 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 8421961791626ab0ebbd8bf901a37476d527def4edbDouglas Gregor // CHECK: 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() { 86766cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie // CHECK: define linkonce_odr void @_ZN6test374funcINS_3fooUt_EEEvT_ 86866cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie func(foo().a); 86966cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie // CHECK: define linkonce_odr void @_ZN6test374funcINS_3fooUt0_EEEvT_ 87066cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie func(*foo::c()); 87166cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie // CHECK: define linkonce_odr void @_ZN6test374funcINS_3fooUt1_EEEvT_ 87266cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie func(foo().d); 87366cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie } 87466cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie} 875f21107b95a65db82f3295fd166074b5a59dfb1a7Tanya Lattner 876f21107b95a65db82f3295fd166074b5a59dfb1a7Tanya Lattner// CHECK: define void @_Z6ASfuncPU3AS3i 877f21107b95a65db82f3295fd166074b5a59dfb1a7Tanya Lattnervoid ASfunc(__attribute__((address_space(3))) int* x) {} 8785bbb0581cb62e019c2b92bdd5362ba93e84e826fRafael Espindola 8795bbb0581cb62e019c2b92bdd5362ba93e84e826fRafael Espindolanamespace test38 { 8805bbb0581cb62e019c2b92bdd5362ba93e84e826fRafael Espindola // CHECK: 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 { 8915e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman // CHECK: 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 { 9025e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman // 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} 913