190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis// Header for PCH test cxx-templates.cpp 290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis 3dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidistemplate <typename T1, typename T2> 45a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidisstruct S; 55a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis 65a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidistemplate <typename T1, typename T2> 790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidisstruct S { 85a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis S() { } 9dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis static void templ(); 10dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis}; 11dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis 12dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidistemplate <typename T> 13dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidisstruct S<int, T> { 14dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis static void partial(); 15dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis}; 16dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis 17dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidistemplate <> 18dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidisstruct S<int, float> { 19dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis static void explicit_special(); 2090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis}; 21f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis 2217cfdeda476aa8899f0ccedd9cb9cdb76e89b6b4Argyrios Kyrtzidistemplate <int x> 2317cfdeda476aa8899f0ccedd9cb9cdb76e89b6b4Argyrios Kyrtzidisint tmpl_f2() { return x; } 2417cfdeda476aa8899f0ccedd9cb9cdb76e89b6b4Argyrios Kyrtzidis 25b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidistemplate <typename T, int y> 26f511ba6277d240bbee1064715da8362a6edee5f3Argyrios KyrtzidisT templ_f(T x) { 27dc767e368471288bef8716d19b0e929647246bfcArgyrios Kyrtzidis int z = templ_f<int, 5>(3); 2817cfdeda476aa8899f0ccedd9cb9cdb76e89b6b4Argyrios Kyrtzidis z = tmpl_f2<y+2>(); 29ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis T data[y]; 30b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis return x+y; 31f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis} 328dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis 33bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidisvoid govl(int); 34bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidisvoid govl(char); 35bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis 36bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidistemplate <typename T> 37bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidisstruct Unresolv { 38bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis void f() { 39bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis govl(T()); 40bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis } 41bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis}; 42bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis 438dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidistemplate <typename T> 448dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidisstruct Dep { 458dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis typedef typename T::type Ty; 468dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis void f() { 478dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis Ty x = Ty(); 488dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis T::my_f(); 498dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis int y = T::template my_templf<int>(0); 50a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis ovl(y); 518dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis } 52a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis 53a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis void ovl(int); 54a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis void ovl(float); 558dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis}; 568dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis 578dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidistemplate<typename T, typename A1> 588dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidisinline T make_a(const A1& a1) { 5912dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis T::depend_declref(); 608dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis return T(a1); 618dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis} 628f4eae96bef0902d93535c18b69154ce66f5e546Argyrios Kyrtzidis 638f4eae96bef0902d93535c18b69154ce66f5e546Argyrios Kyrtzidistemplate <class T> class UseBase { 648f4eae96bef0902d93535c18b69154ce66f5e546Argyrios Kyrtzidis void foo(); 658f4eae96bef0902d93535c18b69154ce66f5e546Argyrios Kyrtzidis typedef int bar; 668f4eae96bef0902d93535c18b69154ce66f5e546Argyrios Kyrtzidis}; 678f4eae96bef0902d93535c18b69154ce66f5e546Argyrios Kyrtzidis 688f4eae96bef0902d93535c18b69154ce66f5e546Argyrios Kyrtzidistemplate <class T> class UseA : public UseBase<T> { 698f4eae96bef0902d93535c18b69154ce66f5e546Argyrios Kyrtzidis using UseBase<T>::foo; 708f4eae96bef0902d93535c18b69154ce66f5e546Argyrios Kyrtzidis using typename UseBase<T>::bar; 718f4eae96bef0902d93535c18b69154ce66f5e546Argyrios Kyrtzidis}; 725a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis 735a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidistemplate <class T> class Sub : public UseBase<int> { }; 745a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis 755a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidistemplate <class _Ret, class _Tp> 765a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis class mem_fun_t 775a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis { 785a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis public: 795a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis explicit 805a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis mem_fun_t(_Ret (_Tp::*__pf)()) 815a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis {} 825a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis 835a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis private: 845a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis _Ret (_Tp::*_M_f)(); 855a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis }; 865a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis 875a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidistemplate<unsigned N> 885a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidisbool isInt(int x); 895a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis 905a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidistemplate<> bool isInt<8>(int x) { 917cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis try { ++x; } catch(...) { --x; } 927cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis return true; 935a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis} 945a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis 955a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidistemplate<typename _CharT> 965a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidisint __copy_streambufs_eof(_CharT); 975a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis 985a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidisclass basic_streambuf 995a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis{ 1005a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis void m() { } 1015a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis friend int __copy_streambufs_eof<>(int); 1025a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis}; 1035a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis 104e3041be307d4c133605544a74f40c42c7531b5bbArgyrios Kyrtzidis// PR 7660 105e3041be307d4c133605544a74f40c42c7531b5bbArgyrios Kyrtzidistemplate<typename T> struct S_PR7660 { void g(void (*)(T)); }; 106e3041be307d4c133605544a74f40c42c7531b5bbArgyrios Kyrtzidis template<> void S_PR7660<int>::g(void(*)(int)) {} 107cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 108cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis// PR 7670 109cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidistemplate<typename> class C_PR7670; 110cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidistemplate<> class C_PR7670<int>; 111cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidistemplate<> class C_PR7670<int>; 112ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis 113ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidistemplate <bool B> 114ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidisstruct S2 { 115ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis static bool V; 116ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis}; 117ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis 118ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidisextern template class S2<true>; 119a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis 120a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidistemplate <typename T> 121a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidisstruct S3 { 122a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis void m(); 123a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis}; 124a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis 125a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidistemplate <typename T> 126a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidisinline void S3<T>::m() { } 1270e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis 1280e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidistemplate <typename T> 1290e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidisstruct S4 { 1300e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis void m() { } 1310e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis}; 1320e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidisextern template struct S4<int>; 1330e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis 1340e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidisvoid S4ImplicitInst() { 1350e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis S4<int> s; 1360e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis s.m(); 1370e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis} 138f84cde1cbc6a6e6c29f20b164af38dffab60366aArgyrios Kyrtzidis 139f84cde1cbc6a6e6c29f20b164af38dffab60366aArgyrios Kyrtzidisstruct S5 { 140f84cde1cbc6a6e6c29f20b164af38dffab60366aArgyrios Kyrtzidis S5(int x); 141f84cde1cbc6a6e6c29f20b164af38dffab60366aArgyrios Kyrtzidis}; 142f84cde1cbc6a6e6c29f20b164af38dffab60366aArgyrios Kyrtzidis 143f84cde1cbc6a6e6c29f20b164af38dffab60366aArgyrios Kyrtzidisstruct TS5 { 144f84cde1cbc6a6e6c29f20b164af38dffab60366aArgyrios Kyrtzidis S5 s; 145f84cde1cbc6a6e6c29f20b164af38dffab60366aArgyrios Kyrtzidis template <typename T> 146f84cde1cbc6a6e6c29f20b164af38dffab60366aArgyrios Kyrtzidis TS5(T y) : s(y) {} 147f84cde1cbc6a6e6c29f20b164af38dffab60366aArgyrios Kyrtzidis}; 14899a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis 14999a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis// PR 8134 15099a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidistemplate<class T> void f_PR8134(T); 15199a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidistemplate<class T> void f_PR8134(T); 15299a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidisvoid g_PR8134() { f_PR8134(0); f_PR8134('x'); } 15332adc8bd6f05d1e26cc221102e48609da2c446baDouglas Gregor 15432adc8bd6f05d1e26cc221102e48609da2c446baDouglas Gregor// rdar8580149 15532adc8bd6f05d1e26cc221102e48609da2c446baDouglas Gregortemplate <typename T> 15632adc8bd6f05d1e26cc221102e48609da2c446baDouglas Gregorstruct S6; 15732adc8bd6f05d1e26cc221102e48609da2c446baDouglas Gregor 15832adc8bd6f05d1e26cc221102e48609da2c446baDouglas Gregortemplate <typename T, unsigned N> 15932adc8bd6f05d1e26cc221102e48609da2c446baDouglas Gregorstruct S6<const T [N]> 16032adc8bd6f05d1e26cc221102e48609da2c446baDouglas Gregor{ 16132adc8bd6f05d1e26cc221102e48609da2c446baDouglas Gregorprivate: 16232adc8bd6f05d1e26cc221102e48609da2c446baDouglas Gregor typedef const T t1[N]; 16332adc8bd6f05d1e26cc221102e48609da2c446baDouglas Gregorpublic: 16432adc8bd6f05d1e26cc221102e48609da2c446baDouglas Gregor typedef t1& t2; 16532adc8bd6f05d1e26cc221102e48609da2c446baDouglas Gregor}; 16632adc8bd6f05d1e26cc221102e48609da2c446baDouglas Gregor 1677c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregortemplate<typename T> 1687c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor struct S7; 1697c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor 1707c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregortemplate<unsigned N> 1717c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregorstruct S7<int[N]> : S6<const int[N]> { }; 172def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor 173def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor// Zero-length template argument lists 174def0354384d9c4431f7b58b664b59896d4623028Douglas Gregornamespace ZeroLengthExplicitTemplateArgs { 175def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor template<typename T> void h(); 176def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor 177def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor struct Y { 178def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor template<typename T> void f(); 179def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor }; 180def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor 181def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor template<typename T> 182def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor void f(T *ptr) { 183def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor T::template g<>(17); 184def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor ptr->template g2<>(17); 185def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor h<T>(); 186def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor h<int>(); 187def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor Y y; 188def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor y.f<int>(); 189def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor } 190def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor 191def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor struct X { 192def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor template<typename T> static void g(T); 193def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor template<typename T> void g2(T); 194def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor }; 195def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor} 19667da6f6f0c20dbfebb1c383a3efaf85d925ad33eDouglas Gregor 19767da6f6f0c20dbfebb1c383a3efaf85d925ad33eDouglas Gregornamespace NonTypeTemplateParmContext { 19867da6f6f0c20dbfebb1c383a3efaf85d925ad33eDouglas Gregor template<typename T, int inlineCapacity = 0> class Vector { }; 19967da6f6f0c20dbfebb1c383a3efaf85d925ad33eDouglas Gregor 20067da6f6f0c20dbfebb1c383a3efaf85d925ad33eDouglas Gregor struct String { 20167da6f6f0c20dbfebb1c383a3efaf85d925ad33eDouglas Gregor template<int inlineCapacity> 20267da6f6f0c20dbfebb1c383a3efaf85d925ad33eDouglas Gregor static String adopt(Vector<char, inlineCapacity>&); 20367da6f6f0c20dbfebb1c383a3efaf85d925ad33eDouglas Gregor }; 20467da6f6f0c20dbfebb1c383a3efaf85d925ad33eDouglas Gregor 20567da6f6f0c20dbfebb1c383a3efaf85d925ad33eDouglas Gregor template<int inlineCapacity> 20667da6f6f0c20dbfebb1c383a3efaf85d925ad33eDouglas Gregor inline bool equalIgnoringNullity(const Vector<char, inlineCapacity>& a, const String& b) { return false; } 20767da6f6f0c20dbfebb1c383a3efaf85d925ad33eDouglas Gregor} 208a8e0b978d63c52e39c002fbf014ce553374fedcfDouglas Gregor 209a8e0b978d63c52e39c002fbf014ce553374fedcfDouglas Gregor// <rdar://problem/11112464> 210a8e0b978d63c52e39c002fbf014ce553374fedcfDouglas Gregortemplate< typename > class Foo; 211a8e0b978d63c52e39c002fbf014ce553374fedcfDouglas Gregor 212a8e0b978d63c52e39c002fbf014ce553374fedcfDouglas Gregortemplate< typename T > 213a8e0b978d63c52e39c002fbf014ce553374fedcfDouglas Gregorclass Foo : protected T 214a8e0b978d63c52e39c002fbf014ce553374fedcfDouglas Gregor{ 215a8e0b978d63c52e39c002fbf014ce553374fedcfDouglas Gregor public: 216a8e0b978d63c52e39c002fbf014ce553374fedcfDouglas Gregor Foo& operator=( const Foo& other ); 217a8e0b978d63c52e39c002fbf014ce553374fedcfDouglas Gregor}; 2189a4db032ecd991626d236a502e770126db32bd31Richard Smith 2199a4db032ecd991626d236a502e770126db32bd31Richard Smithtemplate<typename...A> struct NestedExpansion { 2209a4db032ecd991626d236a502e770126db32bd31Richard Smith template<typename...B> auto f(A...a, B...b) -> decltype(g(a + b...)); 2219a4db032ecd991626d236a502e770126db32bd31Richard Smith}; 2229a4db032ecd991626d236a502e770126db32bd31Richard Smithtemplate struct NestedExpansion<char, char, char>; 2237640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis 2247640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidisnamespace rdar13135282 { 2257640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidistemplate < typename _Alloc > 2267640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidisvoid foo(_Alloc = _Alloc()); 2277640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis 2287640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidistemplate < bool > class __pool; 2297640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis 2307640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidistemplate < template < bool > class _PoolTp > 2317640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidisstruct __common_pool { 2327640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis typedef _PoolTp < 0 > pool_type; 2337640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis}; 2347640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis 2357640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidistemplate < template < bool > class _PoolTp > 2367640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidisstruct __common_pool_base : __common_pool < _PoolTp > {}; 2377640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis 2387640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidistemplate < template < bool > class _PoolTp > 2397640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidisstruct A : __common_pool_base < _PoolTp > {}; 2407640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis 2417640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidistemplate < typename _Poolp = A < __pool > > 2427640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidisstruct __mt_alloc { 2437640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis typedef typename _Poolp::pool_type __pool_type; 2447640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis __mt_alloc() { 2457640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis foo<__mt_alloc<> >(); 2467640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis } 2477640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis}; 2487640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis} 2490378433dcdf9a5701207c2a592b10da71ad9ba5dArgyrios Kyrtzidis 2500378433dcdf9a5701207c2a592b10da71ad9ba5dArgyrios Kyrtzidisnamespace PR13020 { 2510378433dcdf9a5701207c2a592b10da71ad9ba5dArgyrios Kyrtzidistemplate<typename T> 2520378433dcdf9a5701207c2a592b10da71ad9ba5dArgyrios Kyrtzidisvoid f() { 2530378433dcdf9a5701207c2a592b10da71ad9ba5dArgyrios Kyrtzidis enum E { 2540378433dcdf9a5701207c2a592b10da71ad9ba5dArgyrios Kyrtzidis enumerator 2550378433dcdf9a5701207c2a592b10da71ad9ba5dArgyrios Kyrtzidis }; 2560378433dcdf9a5701207c2a592b10da71ad9ba5dArgyrios Kyrtzidis 2570378433dcdf9a5701207c2a592b10da71ad9ba5dArgyrios Kyrtzidis T t = enumerator; 2580378433dcdf9a5701207c2a592b10da71ad9ba5dArgyrios Kyrtzidis} 2590378433dcdf9a5701207c2a592b10da71ad9ba5dArgyrios Kyrtzidis 2600378433dcdf9a5701207c2a592b10da71ad9ba5dArgyrios Kyrtzidistemplate void f<int>(); 2610378433dcdf9a5701207c2a592b10da71ad9ba5dArgyrios Kyrtzidis} 262f396ad9b1fa0c74c9db16a8158c3882c9db774e2Richard Smith 263f396ad9b1fa0c74c9db16a8158c3882c9db774e2Richard Smithtemplate<typename T> void doNotDeserialize() {} 264f396ad9b1fa0c74c9db16a8158c3882c9db774e2Richard Smithtemplate<typename T> struct ContainsDoNotDeserialize { 265f396ad9b1fa0c74c9db16a8158c3882c9db774e2Richard Smith static int doNotDeserialize; 266f396ad9b1fa0c74c9db16a8158c3882c9db774e2Richard Smith}; 267f396ad9b1fa0c74c9db16a8158c3882c9db774e2Richard Smithtemplate<typename T> struct ContainsDoNotDeserialize2 { 268f396ad9b1fa0c74c9db16a8158c3882c9db774e2Richard Smith static void doNotDeserialize(); 269f396ad9b1fa0c74c9db16a8158c3882c9db774e2Richard Smith}; 270f396ad9b1fa0c74c9db16a8158c3882c9db774e2Richard Smithtemplate<typename T> int ContainsDoNotDeserialize<T>::doNotDeserialize = 0; 271f396ad9b1fa0c74c9db16a8158c3882c9db774e2Richard Smithtemplate<typename T> void ContainsDoNotDeserialize2<T>::doNotDeserialize() {} 2720fa93cecf26a157dec7def11ffa4080ae75fe559Eli Friedman 2730fa93cecf26a157dec7def11ffa4080ae75fe559Eli Friedman 2740fa93cecf26a157dec7def11ffa4080ae75fe559Eli Friedmantemplate<typename T> void DependentSpecializedFunc(T x) { x.foo(); } 2750fa93cecf26a157dec7def11ffa4080ae75fe559Eli Friedmantemplate<typename T> class DependentSpecializedFuncClass { 2760fa93cecf26a157dec7def11ffa4080ae75fe559Eli Friedman void foo() {} 2770fa93cecf26a157dec7def11ffa4080ae75fe559Eli Friedman friend void DependentSpecializedFunc<>(DependentSpecializedFuncClass); 2780fa93cecf26a157dec7def11ffa4080ae75fe559Eli Friedman}; 279e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith 280e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smithnamespace cyclic_module_load { 281e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith // Reduced from a libc++ modules crasher. 282e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith namespace std { 283e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith template<class> class mask_array; 284e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith template<class> class valarray { 285e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith public: 286e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith valarray(const valarray &v); 287e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith }; 288e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith 289e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith class gslice { 290e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith valarray<int> x; 291e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith valarray<int> stride() const { return x; } 292e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith }; 293e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith 294e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith template<class> class mask_array { 295e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith template<class> friend class valarray; 296e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith }; 297e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith } 298e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith} 299dd9459f8869f66409f7ea429053b453e33f6499cRichard Smith 300dd9459f8869f66409f7ea429053b453e33f6499cRichard Smithnamespace local_extern { 301dd9459f8869f66409f7ea429053b453e33f6499cRichard Smith template<typename T> int f() { 302dd9459f8869f66409f7ea429053b453e33f6499cRichard Smith extern int arr[3]; 303dd9459f8869f66409f7ea429053b453e33f6499cRichard Smith { 304dd9459f8869f66409f7ea429053b453e33f6499cRichard Smith extern T arr; 305dd9459f8869f66409f7ea429053b453e33f6499cRichard Smith return sizeof(arr); 306dd9459f8869f66409f7ea429053b453e33f6499cRichard Smith } 307dd9459f8869f66409f7ea429053b453e33f6499cRichard Smith } 308dd9459f8869f66409f7ea429053b453e33f6499cRichard Smith template<typename T> int g() { 309dd9459f8869f66409f7ea429053b453e33f6499cRichard Smith extern int arr[3]; 310dd9459f8869f66409f7ea429053b453e33f6499cRichard Smith extern T arr; 311dd9459f8869f66409f7ea429053b453e33f6499cRichard Smith return sizeof(arr); 312dd9459f8869f66409f7ea429053b453e33f6499cRichard Smith } 313dd9459f8869f66409f7ea429053b453e33f6499cRichard Smith} 314651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 315651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace rdar15468709a { 316651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename> struct decay {}; 317651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 318651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename FooParamTy> auto foo(FooParamTy fooParam) -> decltype(fooParam); 319651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename BarParamTy> auto bar(BarParamTy barParam) -> decay<decltype(barParam)>; 320651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 321651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct B {}; 322651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 323651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void crash() { 324651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines B some; 325651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bar(some); 326651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 327651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 328651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 329651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace rdar15468709b { 330651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename> struct decay {}; 331651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 332651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename... Foos> int returnsInt(Foos... foos); 333651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 334651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename... FooParamTy> auto foo(FooParamTy... fooParam) -> decltype(returnsInt(fooParam...)); 335651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename... BarParamTy> auto bar(BarParamTy... barParam) -> decay<decltype(returnsInt(barParam...))>; 336651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 337651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct B {}; 338651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 339651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void crash() { 340651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines B some; 341651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bar(some); 342651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 343651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 344651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 345651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace rdar15468709c { 346651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename> struct decay {}; 347651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 348651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<class... Foos> int returnsInt(Foos... foos); 349651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 350651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename FooParamTy> void foo(FooParamTy fooParam) { decltype(fooParam) a; } 351651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename BarParamTy> auto bar(BarParamTy barParam) -> decay<decltype(barParam)>; 352651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 353651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct B {}; 354651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 355651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void crash() { 356651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines B some; 357651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bar(some); 358651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 359651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 360651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 361