1dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s 2dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov// expected-no-diagnostics 3dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 4dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovnamespace pr12262 { 5dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 6dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate<typename T, typename... Ts> 7dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovvoid abc1(int (*xxx)[sizeof ... (Ts) + 1]); 8dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 9dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovvoid qq1 () { 10dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov abc1<int>(0); 11dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov abc1<int,double>(0); 12dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov} 13dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 14dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 15dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate <unsigned N> class array {}; 16dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 17dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 18dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate<typename T, typename... Types> 19dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovarray<sizeof...(Types)> make_array1(Types&&... args); 20dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 21dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovvoid qq2 () { 22dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov array<1> arr = make_array1<int>(1); 23dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov array<3> arr2 = make_array1<int>(1,array<5>(),0.1); 24dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov} 25dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 26dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 27dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate<typename T, typename... Types> 28dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovint make_array(array<sizeof...(Types)>&, Types... args); 29dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 30dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovvoid qq3 () { 31dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov array<1> a1; 32dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov int aa1 = make_array<int>(a1,1); 33dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov array<2> a2; 34dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov int aa2 = make_array<int>(a2, 0L, "abc"); 35dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov} 36dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 37dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 38dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate<typename ... Ts> 39dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovstruct AAA { 40dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov template<typename T, typename... Types> 41dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov static array<sizeof...(Types)> make_array(Types ... args); 42dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov}; 43dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 44dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovvoid qq4 () { 45dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov array<2> arr2 = AAA<int, int>::make_array<int>(1,2); 46dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov} 47dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 48dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov} 49dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 50dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 51dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovnamespace pr12439 { 52dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 53dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate<class... Members> 54dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovstruct X { 55dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov template<int Idx> 56dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov using get_t = decltype(sizeof...(Members)); 57dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 58dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov template<int i> 59dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov get_t<i> get(); 60dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov}; 61dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 62dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate<class... Members> 63dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate<int i> 64dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge PavlovX<Members...>::get_t<i> X<Members...>::get() 65dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov{ 66dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov return 0; 67dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov} 68dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 69dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov} 70dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 71dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 72dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovnamespace pr13272 { 73dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 74dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate<bool B, class T = void> 75dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovstruct enable_if { }; 76dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 77dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate<class T> struct enable_if<true, T> { 78dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov typedef T type; 79dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov}; 80dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 81dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovclass Exception {}; 82dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 83dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate<class Ex, typename... Args> 84dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovvoid cxx_throw(typename enable_if<(sizeof...(Args) > 0), const char *>::type fmt, Args&&... args) { 85dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov return; 86dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov} 87dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 88dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovvoid test() { 89dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov cxx_throw<Exception>("Youpi",1); 90dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov} 91dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 92dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov} 93dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 94dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 95dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovnamespace pr13817 { 96dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 97dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate <unsigned> 98dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovstruct zod; 99dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 100dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate <> 101dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovstruct zod<1> {}; 102dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 103dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate <typename T, typename ... Ts> 104dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovzod<sizeof...(Ts)> make_zod(Ts ...) { 105dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov return zod<sizeof...(Ts)>(); 106dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov} 107dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 108dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovint main(int argc, char *argv[]) 109dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov{ 110dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov make_zod<int>(1); 111dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov return 0; 112dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov} 113dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 114dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov} 115dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 116dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 117dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovnamespace pr14273 { 118dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 119dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate<typename T, int i> 120dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovstruct myType 121dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov{ }; 122dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 123dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate<typename T, typename... Args> 124dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovstruct Counter 125dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov{ 126dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov static const int count = 1 + Counter<Args...>::count; 127dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov}; 128dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 129dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate<typename T> 130dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovstruct Counter<T> 131dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov{ 132dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov static const int count = 1; 133dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov}; 134dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 135dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate<typename Arg, typename... Args> 136dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge PavlovmyType<Arg, sizeof...(Args)>* make_array_with_type(const Args&... args) 137dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov{ 138dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov return 0; 139dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov} 140dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 141dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovvoid func(void) 142dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov{ 143dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov make_array_with_type<char>(1,2,3); 144dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov} 145dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 146dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov} 147dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 148dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 149dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovnamespace pr15112 150dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov{ 151dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov template<bool, typename _Tp = void> 152dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov struct enable_if 153dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov { }; 154dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov template<typename _Tp> 155dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov struct enable_if<true,_Tp> 156dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov { typedef _Tp type; }; 157dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 158dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov typedef __typeof__(sizeof(int)) size_t; 159dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 160dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov template <size_t n, typename T, typename... Args> 161dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov struct is_array_of { static const bool value = true; }; 162dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 163dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov struct cpu { using value_type = void; }; 164dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 165dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov template <size_t Order, typename T> 166dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov struct coords_alias { typedef T type; }; 167dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 168dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov template <size_t Order, typename MemoryTag> 169dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov using coords = typename coords_alias<Order, MemoryTag>::type; 170dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 171dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov template <typename MemTag, typename... Args> 172dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov typename enable_if<is_array_of<sizeof...(Args), size_t, Args...>::value, 173dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov coords<sizeof...(Args), MemTag>>::type 174dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov mkcoords(Args... args); 175dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov 176dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov auto c1 = mkcoords<cpu>(0ul, 0ul, 0ul); 177dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov} 1783cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov 1793cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov 1803cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlovnamespace pr12699 { 1813cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov 1823cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlovtemplate<bool B> 1833cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlovstruct bool_constant 1843cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov{ 1853cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov static const bool value = B; 1863cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov}; 1873cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov 1883cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlovtemplate<typename... A> 1893cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlovstruct F 1903cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov{ 1913cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov template<typename... B> 1923cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov using SameSize = bool_constant<sizeof...(A) == sizeof...(B)>; 1933cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov 1943cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov template<typename... B, typename = SameSize<B...>> 1953cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov F(B...) { } 1963cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov}; 1973cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov 1983cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlovvoid func() 1993cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov{ 2003cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov F<int> f1(3); 2013cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov} 2023cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov 2033cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov} 204