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