1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -std=c++11 -fsyntax-only -fexceptions -fcxx-exceptions -verify %s 28491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 388f30dee6ca6d99e46d4ce61f691fb3dff4ae7c8Douglas Gregortemplate<typename... Types> struct tuple; 456bc9832bc8f80604bfddc2c93f81537df6930a1Douglas Gregortemplate<int I> struct int_c; 556bc9832bc8f80604bfddc2c93f81537df6930a1Douglas Gregor 656bc9832bc8f80604bfddc2c93f81537df6930a1Douglas Gregortemplate<typename T> 756bc9832bc8f80604bfddc2c93f81537df6930a1Douglas Gregorstruct identity { 856bc9832bc8f80604bfddc2c93f81537df6930a1Douglas Gregor typedef T type; 956bc9832bc8f80604bfddc2c93f81537df6930a1Douglas Gregor}; 1056bc9832bc8f80604bfddc2c93f81537df6930a1Douglas Gregor 1156bc9832bc8f80604bfddc2c93f81537df6930a1Douglas Gregortemplate<typename T, typename U> 1256bc9832bc8f80604bfddc2c93f81537df6930a1Douglas Gregorstruct is_same { 1356bc9832bc8f80604bfddc2c93f81537df6930a1Douglas Gregor static const bool value = false; 1456bc9832bc8f80604bfddc2c93f81537df6930a1Douglas Gregor}; 1556bc9832bc8f80604bfddc2c93f81537df6930a1Douglas Gregor 1656bc9832bc8f80604bfddc2c93f81537df6930a1Douglas Gregortemplate<typename T> 1756bc9832bc8f80604bfddc2c93f81537df6930a1Douglas Gregorstruct is_same<T, T> { 1856bc9832bc8f80604bfddc2c93f81537df6930a1Douglas Gregor static const bool value = true; 1956bc9832bc8f80604bfddc2c93f81537df6930a1Douglas Gregor}; 208491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 21a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor// FIXME: Several more bullets to go 228491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 237c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith// In a function parameter pack, the pattern is the parameter-declaration 247c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith// without the ellipsis. 257c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smithnamespace PR11850 { 267c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith template<typename ...T> struct S { 277c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith int f(T...a, int b) { return b; } 287c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith }; 297c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith S<> s; 307c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith S<int*, char, const double&> t; 317c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith int k = s.f(0); 327c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith int l = t.f(&k, 'x', 5.9, 4); 337c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith 347c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith template<typename ...As> struct A { 357c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith template<typename ...Bs> struct B { 367c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith template<typename ...Cs> struct C { 377c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith C(As..., Bs..., int &k, Cs...); 387c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith }; 397c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith }; 407c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith }; 417c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith A<>::B<>::C<> c000(k); 427c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith A<int>::B<>::C<int> c101(1, k, 3); 437c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith A<>::B<int>::C<int> c011(1, k, 3); 447c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith A<int>::B<int>::C<> c110(1, 2, k); 457c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith A<int, int>::B<int, int>::C<int, int> c222(1, 2, 3, 4, k, 5, 6); 467c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith A<int, int, int>::B<>::C<> c300(1, 2, 3, k); 477c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith 487c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith int &f(); 497c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith char &f(void*); 507c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith template<typename ...A> struct U { 517c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith template<typename ...B> struct V { 527c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith auto g(A...a, B...b) -> decltype(f(a...)); 537c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith }; 547c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith }; 557c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith U<>::V<int*> v0; 567c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith U<int*>::V<> v1; 577c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith int &v0f = v0.g(0); 587c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith char &v1f = v1.g(0); 597c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith} 607c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smithnamespace PR12096 { 617c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith void Foo(int) {} 627c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith void Foo(int, int) = delete; 637c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith template<typename ...Args> struct Var { 647c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith Var(const Args &...args, int *) { Foo(args...); } 657c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith }; 667c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith Var<int> var(1, 0); 677c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith} 687c5d28b6342229fb648aea59dc063f67ff16bc81Richard Smith 69dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor// In an initializer-list (8.5); the pattern is an initializer-clause. 70dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor// Note: this also covers expression-lists, since expression-list is 71dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor// just defined as initializer-list. 72dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregorvoid five_args(int, int, int, int, int); // expected-note{{candidate function not viable: requires 5 arguments, but 6 were provided}} 73dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor 74dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregortemplate<int ...Values> 75dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregorvoid initializer_list_expansion() { 76dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor int values[5] = { Values... }; // expected-error{{excess elements in array initializer}} 77dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor five_args(Values...); // expected-error{{no matching function for call to 'five_args'}} 78dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor} 79dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor 80dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregortemplate void initializer_list_expansion<1, 2, 3, 4, 5>(); 81dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregortemplate 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}} 82dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor 8307a77b4b1d1fa95930129541eff8b79558f5d80dDouglas Gregornamespace PR8977 { 8407a77b4b1d1fa95930129541eff8b79558f5d80dDouglas Gregor struct A { }; 8507a77b4b1d1fa95930129541eff8b79558f5d80dDouglas Gregor template<typename T, typename... Args> void f(Args... args) { 866aeaa60217e1ed11a621409acf1b53df0d14b591Eli Friedman // An empty expression-list performs value initialization. 876aeaa60217e1ed11a621409acf1b53df0d14b591Eli Friedman constexpr T t(args...); 8807a77b4b1d1fa95930129541eff8b79558f5d80dDouglas Gregor }; 8907a77b4b1d1fa95930129541eff8b79558f5d80dDouglas Gregor 9007a77b4b1d1fa95930129541eff8b79558f5d80dDouglas Gregor template void f<A>(); 9107a77b4b1d1fa95930129541eff8b79558f5d80dDouglas Gregor} 9207a77b4b1d1fa95930129541eff8b79558f5d80dDouglas Gregor 93f90b27ad077c3339b62befc892382845339f9490Douglas Gregor// In a base-specifier-list (Clause 10); the pattern is a base-specifier. 94f90b27ad077c3339b62befc892382845339f9490Douglas Gregortemplate<typename ...Mixins> 953fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregorstruct HasMixins : public Mixins... { 963fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor HasMixins(); 973fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor HasMixins(const HasMixins&); 983fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor HasMixins(int i); 993fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor}; 100f90b27ad077c3339b62befc892382845339f9490Douglas Gregor 1013fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregorstruct A { }; // expected-note{{candidate constructor (the implicit copy constructor) not viable: no known conversion from 'int' to 'const A' for 1st argument}} \ 10285ea7aa961deac1d754f610af8062ae3f8b4e2a5Sebastian Redl// expected-note{{candidate constructor (the implicit move constructor) not viable: no known conversion from 'int' to 'A' for 1st argument}} \ 1033fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor// expected-note{{candidate constructor (the implicit default constructor) not viable: requires 0 arguments, but 1 was provided}} 104f90b27ad077c3339b62befc892382845339f9490Douglas Gregorstruct B { }; 105f90b27ad077c3339b62befc892382845339f9490Douglas Gregorstruct C { }; 106f90b27ad077c3339b62befc892382845339f9490Douglas Gregorstruct D { }; 107f90b27ad077c3339b62befc892382845339f9490Douglas Gregor 108f90b27ad077c3339b62befc892382845339f9490Douglas GregorA *checkA = new HasMixins<A, B, C, D>; 109f90b27ad077c3339b62befc892382845339f9490Douglas GregorB *checkB = new HasMixins<A, B, C, D>; 110f90b27ad077c3339b62befc892382845339f9490Douglas GregorD *checkD = new HasMixins<A, B, C, D>; 111f90b27ad077c3339b62befc892382845339f9490Douglas GregorC *checkC = new HasMixins<A, B, D>; // expected-error{{cannot initialize a variable of type 'C *' with an rvalue of type 'HasMixins<A, B, D> *'}} 112f90b27ad077c3339b62befc892382845339f9490Douglas GregorHasMixins<> *checkNone = new HasMixins<>; 113f90b27ad077c3339b62befc892382845339f9490Douglas Gregor 114f90b27ad077c3339b62befc892382845339f9490Douglas Gregortemplate<typename Mixins> 115f90b27ad077c3339b62befc892382845339f9490Douglas Gregorstruct BrokenMixins : public Mixins... { }; // expected-error{{pack expansion does not contain any unexpanded parameter packs}} 116f90b27ad077c3339b62befc892382845339f9490Douglas Gregor 1173fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor// In a mem-initializer-list (12.6.2); the pattern is a mem-initializer. 1183fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregortemplate<typename ...Mixins> 1193fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas GregorHasMixins<Mixins...>::HasMixins(): Mixins()... { } 1203fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor 1213fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregortemplate<typename ...Mixins> 1223fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas GregorHasMixins<Mixins...>::HasMixins(const HasMixins &other): Mixins(other)... { } 1233fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor 1243fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregortemplate<typename ...Mixins> 1253fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas GregorHasMixins<Mixins...>::HasMixins(int i): Mixins(i)... { } // expected-error{{no matching constructor for initialization of 'A'}} 1263fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor 1273fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregorvoid test_has_mixins() { 1283fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor HasMixins<A, B> ab; 1293fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor HasMixins<A, B> ab2 = ab; 1303fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor HasMixins<A, B> ab3(17); // expected-note{{in instantiation of member function 'HasMixins<A, B>::HasMixins' requested here}} 1313fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor} 1323fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor 1333fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregortemplate<typename T> 1343fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregorstruct X { 1353fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor T member; 1363fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor 1373fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor X() : member()... { } // expected-error{{pack expansion for initialization of member 'member'}} 1383fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor}; 1393fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor 140e9ee382c32a83e9807a2fe4cfd52b5a11169a4b8Eli Friedman// There was a bug in the delayed parsing code for the 141e9ee382c32a83e9807a2fe4cfd52b5a11169a4b8Eli Friedman// following case. 142e9ee382c32a83e9807a2fe4cfd52b5a11169a4b8Eli Friedmantemplate<typename ...T> 143e9ee382c32a83e9807a2fe4cfd52b5a11169a4b8Eli Friedmanstruct DelayedParseTest : T... 144e9ee382c32a83e9807a2fe4cfd52b5a11169a4b8Eli Friedman{ 145e9ee382c32a83e9807a2fe4cfd52b5a11169a4b8Eli Friedman int a; 146e9ee382c32a83e9807a2fe4cfd52b5a11169a4b8Eli Friedman DelayedParseTest(T... i) : T{i}..., a{10} {} 147e9ee382c32a83e9807a2fe4cfd52b5a11169a4b8Eli Friedman}; 148e9ee382c32a83e9807a2fe4cfd52b5a11169a4b8Eli Friedman 149e9ee382c32a83e9807a2fe4cfd52b5a11169a4b8Eli Friedman 1508491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor// In a template-argument-list (14.3); the pattern is a template-argument. 1518491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregortemplate<typename ...Types> 1528491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregorstruct tuple_of_refs { 15388f30dee6ca6d99e46d4ce61f691fb3dff4ae7c8Douglas Gregor typedef tuple<Types& ...> types; 1548491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor}; 1558491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 15688f30dee6ca6d99e46d4ce61f691fb3dff4ae7c8Douglas Gregortuple<int&, float&> *t_int_ref_float_ref; 1578491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregortuple_of_refs<int&, float&>::types *t_int_ref_float_ref_2 = t_int_ref_float_ref; 158dace95b13e2ceb0c3ec8de6babd926dc5114e1e5Douglas Gregor 15988f30dee6ca6d99e46d4ce61f691fb3dff4ae7c8Douglas Gregortemplate<typename ...Types> 16088f30dee6ca6d99e46d4ce61f691fb3dff4ae7c8Douglas Gregorstruct extract_nested_types { 16188f30dee6ca6d99e46d4ce61f691fb3dff4ae7c8Douglas Gregor typedef tuple<typename Types::type...> types; 16288f30dee6ca6d99e46d4ce61f691fb3dff4ae7c8Douglas Gregor}; 16388f30dee6ca6d99e46d4ce61f691fb3dff4ae7c8Douglas Gregor 16488f30dee6ca6d99e46d4ce61f691fb3dff4ae7c8Douglas Gregortuple<int, float> *t_int_float; 16588f30dee6ca6d99e46d4ce61f691fb3dff4ae7c8Douglas Gregorextract_nested_types<identity<int>, identity<float> >::types *t_int_float_2 16688f30dee6ca6d99e46d4ce61f691fb3dff4ae7c8Douglas Gregor = t_int_float; 167a04426c5416f22df1078f6b31c1619de73c40b59Douglas Gregor 16856bc9832bc8f80604bfddc2c93f81537df6930a1Douglas Gregortemplate<int ...N> 16956bc9832bc8f80604bfddc2c93f81537df6930a1Douglas Gregorstruct tuple_of_ints { 17056bc9832bc8f80604bfddc2c93f81537df6930a1Douglas Gregor typedef tuple<int_c<N>...> type; 17156bc9832bc8f80604bfddc2c93f81537df6930a1Douglas Gregor}; 17256bc9832bc8f80604bfddc2c93f81537df6930a1Douglas Gregor 17356bc9832bc8f80604bfddc2c93f81537df6930a1Douglas Gregorint check_temp_arg_1[is_same<tuple_of_ints<1, 2, 3, 4, 5>::type, 17456bc9832bc8f80604bfddc2c93f81537df6930a1Douglas Gregor tuple<int_c<1>, int_c<2>, int_c<3>, int_c<4>, 17556bc9832bc8f80604bfddc2c93f81537df6930a1Douglas Gregor int_c<5>>>::value? 1 : -1]; 17656bc9832bc8f80604bfddc2c93f81537df6930a1Douglas Gregor 177a04426c5416f22df1078f6b31c1619de73c40b59Douglas Gregor// In a dynamic-exception-specification (15.4); the pattern is a type-id. 178a04426c5416f22df1078f6b31c1619de73c40b59Douglas Gregortemplate<typename ...Types> 179a04426c5416f22df1078f6b31c1619de73c40b59Douglas Gregorstruct f_with_except { 180b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor virtual void f() throw(Types...); // expected-note{{overridden virtual function is here}} 181a04426c5416f22df1078f6b31c1619de73c40b59Douglas Gregor}; 182a04426c5416f22df1078f6b31c1619de73c40b59Douglas Gregor 183a04426c5416f22df1078f6b31c1619de73c40b59Douglas Gregorstruct check_f_with_except_1 : f_with_except<int, float> { 184a04426c5416f22df1078f6b31c1619de73c40b59Douglas Gregor virtual void f() throw(int, float); 185a04426c5416f22df1078f6b31c1619de73c40b59Douglas Gregor}; 186a04426c5416f22df1078f6b31c1619de73c40b59Douglas Gregor 187a04426c5416f22df1078f6b31c1619de73c40b59Douglas Gregorstruct check_f_with_except_2 : f_with_except<int, float> { 188a04426c5416f22df1078f6b31c1619de73c40b59Douglas Gregor virtual void f() throw(int); 189a04426c5416f22df1078f6b31c1619de73c40b59Douglas Gregor}; 190b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor 191b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregorstruct check_f_with_except_3 : f_with_except<int, float> { 192b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor virtual void f() throw(int, float, double); // expected-error{{exception specification of overriding function is more lax than base version}} 193b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor}; 194