12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RUN: %clang_cc1 -std=c++11 -fsyntax-only -fexceptions -fcxx-exceptions -verify %s 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename... Types> struct tuple; 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<int I> struct int_c; 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename T> 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct identity { 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef T type; 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename T, typename U> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct is_same { 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const bool value = false; 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template<typename T> 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct is_same<T, T> { 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch static const bool value = true; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// FIXME: Several more bullets to go 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// In a function parameter pack, the pattern is the parameter-declaration 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// without the ellipsis. 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace PR11850 { 266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) template<typename ...T> struct S { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int f(T...a, int b) { return b; } 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) S<> s; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) S<int*, char, const double&> t; 31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int k = s.f(0); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int l = t.f(&k, 'x', 5.9, 4); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) template<typename ...As> struct A { 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) template<typename ...Bs> struct B { 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch template<typename ...Cs> struct C { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) C(As..., Bs..., int &k, Cs...); 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) }; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) }; 416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) A<>::B<>::C<> c000(k); 42c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch A<int>::B<>::C<int> c101(1, k, 3); 436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) A<>::B<int>::C<int> c011(1, k, 3); 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci A<int>::B<int>::C<> c110(1, 2, k); 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) A<int, int>::B<int, int>::C<int, int> c222(1, 2, 3, 4, k, 5, 6); 466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) A<int, int, int>::B<>::C<> c300(1, 2, 3, k); 476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int &f(); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char &f(void*); 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) template<typename ...A> struct U { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<typename ...B> struct V { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) auto g(A...a, B...b) -> decltype(f(a...)); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) U<>::V<int*> v0; 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch U<int*>::V<> v1; 57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch int &v0f = v0.g(0); 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) char &v1f = v1.g(0); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace PR12096 { 6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void Foo(int) {} 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void Foo(int, int) = delete; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<typename ...Args> struct Var { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Var(const Args &...args, int *) { Foo(args...); } 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Var<int> var(1, 0); 6723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// In an initializer-list (8.5); the pattern is an initializer-clause. 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Note: this also covers expression-lists, since expression-list is 71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// just defined as initializer-list. 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void five_args(int, int, int, int, int); // expected-note{{candidate function not viable: requires 5 arguments, but 6 were provided}} 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)template<int ...Values> 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void initializer_list_expansion() { 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int values[5] = { Values... }; // expected-error{{excess elements in array initializer}} 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) five_args(Values...); // expected-error{{no matching function for call to 'five_args'}} 78a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)template void initializer_list_expansion<1, 2, 3, 4, 5>(); 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)template void initializer_list_expansion<1, 2, 3, 4, 5, 6>(); // expected-note{{in instantiation of function template specialization 'initializer_list_expansion<1, 2, 3, 4, 5, 6>' requested here}} 828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace PR8977 { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct A { }; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<typename T, typename... Args> void f(Args... args) { 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // An empty expression-list performs value initialization. 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci constexpr T t(args...); 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template void f<A>(); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In a base-specifier-list (Clause 10); the pattern is a base-specifier. 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename ...Mixins> 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct HasMixins : public Mixins... { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HasMixins(); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HasMixins(const HasMixins&); 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) HasMixins(int i); 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)struct A { }; // expected-note{{candidate constructor (the implicit copy constructor) not viable: no known conversion from 'int' to 'const A' for 1st argument}} \ 102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// expected-note{{candidate constructor (the implicit move constructor) not viable: no known conversion from 'int' to 'A' for 1st argument}} \ 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// expected-note{{candidate constructor (the implicit default constructor) not viable: requires 0 arguments, but 1 was provided}} 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct B { }; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct C { }; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct D { }; 107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 108c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochA *checkA = new HasMixins<A, B, C, D>; 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)B *checkB = new HasMixins<A, B, C, D>; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)D *checkD = new HasMixins<A, B, C, D>; 111d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)C *checkC = new HasMixins<A, B, D>; // expected-error{{cannot initialize a variable of type 'C *' with an rvalue of type 'HasMixins<A, B, D> *'}} 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HasMixins<> *checkNone = new HasMixins<>; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename Mixins> 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct BrokenMixins : public Mixins... { }; // expected-error{{pack expansion does not contain any unexpanded parameter packs}} 116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// In a mem-initializer-list (12.6.2); the pattern is a mem-initializer. 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template<typename ...Mixins> 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)HasMixins<Mixins...>::HasMixins(): Mixins()... { } 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename ...Mixins> 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HasMixins<Mixins...>::HasMixins(const HasMixins &other): Mixins(other)... { } 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename ...Mixins> 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HasMixins<Mixins...>::HasMixins(int i): Mixins(i)... { } // expected-error{{no matching constructor for initialization of 'A'}} 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void test_has_mixins() { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HasMixins<A, B> ab; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HasMixins<A, B> ab2 = ab; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HasMixins<A, B> ab3(17); // expected-note{{in instantiation of member function 'HasMixins<A, B>::HasMixins' requested here}} 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename T> 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct X { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) T member; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) X() : member()... { } // expected-error{{pack expansion for initialization of member 'member'}} 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// There was a bug in the delayed parsing code for the 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// following case. 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename ...T> 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct DelayedParseTest : T... 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int a; 1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DelayedParseTest(T... i) : T{i}..., a{10} {} 1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In a template-argument-list (14.3); the pattern is a template-argument. 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename ...Types> 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct tuple_of_refs { 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef tuple<Types& ...> types; 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)tuple<int&, float&> *t_int_ref_float_ref; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)tuple_of_refs<int&, float&>::types *t_int_ref_float_ref_2 = t_int_ref_float_ref; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename ...Types> 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct extract_nested_types { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef tuple<typename Types::type...> types; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)tuple<int, float> *t_int_float; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extract_nested_types<identity<int>, identity<float> >::types *t_int_float_2 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) = t_int_float; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)template<int ...N> 1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)struct tuple_of_ints { 1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) typedef tuple<int_c<N>...> type; 1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)int check_temp_arg_1[is_same<tuple_of_ints<1, 2, 3, 4, 5>::type, 1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) tuple<int_c<1>, int_c<2>, int_c<3>, int_c<4>, 1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int_c<5>>>::value? 1 : -1]; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In a dynamic-exception-specification (15.4); the pattern is a type-id. 178effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochtemplate<typename ...Types> 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct f_with_except { 1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void f() throw(Types...); // expected-note{{overridden virtual function is here}} 1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct check_f_with_except_1 : f_with_except<int, float> { 18403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual void f() throw(int, float); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct check_f_with_except_2 : f_with_except<int, float> { 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void f() throw(int); 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct check_f_with_except_3 : f_with_except<int, float> { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void f() throw(int, float, double); // expected-error{{exception specification of overriding function is more lax than base version}} 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)