p4.cpp revision 6aeaa60217e1ed11a621409acf1b53df0d14b591
14fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// RUN: %clang_cc1 -std=c++11 -fsyntax-only -fexceptions -fcxx-exceptions -verify %s 24fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor 34fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregortemplate<typename... Types> struct tuple; 44fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregortemplate<int I> struct int_c; 54fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor 64fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregortemplate<typename T> 74fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregorstruct identity { 84fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor typedef T type; 94fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor}; 10d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 114fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregortemplate<typename T, typename U> 124fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregorstruct is_same { 134fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor static const bool value = false; 144fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor}; 152fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer 164fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregortemplate<typename T> 174fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregorstruct is_same<T, T> { 184fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor static const bool value = true; 192fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer}; 204fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor 219db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor// FIXME: Several more bullets to go 224fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor 2315de72cf580840c61e5704c2f8a2b56f9d0638e1Douglas Gregor// In an initializer-list (8.5); the pattern is an initializer-clause. 244fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// Note: this also covers expression-lists, since expression-list is 254fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// just defined as initializer-list. 264fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregorvoid five_args(int, int, int, int, int); // expected-note{{candidate function not viable: requires 5 arguments, but 6 were provided}} 274fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor 28770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramertemplate<int ...Values> 295f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid initializer_list_expansion() { 304fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor int values[5] = { Values... }; // expected-error{{excess elements in array initializer}} 314fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor five_args(Values...); // expected-error{{no matching function for call to 'five_args'}} 325cb3d699f0e37de1767eb23d26d03953a46cf1ffRichard Trieu} 334fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor 345f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnertemplate void initializer_list_expansion<1, 2, 3, 4, 5>(); 355f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnertemplate 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}} 365f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner 374fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregornamespace PR8977 { 380d59292581dbaa4203451709077de40e0ad72c18Anders Carlsson struct A { }; 391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump template<typename T, typename... Args> void f(Args... args) { 404fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor // An empty expression-list performs value initialization. 41d1420c6fa788669e49f21e184927c7833881e399Richard Smith constexpr T t(args...); 42d1420c6fa788669e49f21e184927c7833881e399Richard Smith }; 43d1420c6fa788669e49f21e184927c7833881e399Richard Smith 445cb3d699f0e37de1767eb23d26d03953a46cf1ffRichard Trieu template void f<A>(); 454fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor} 464fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor 474fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// In a base-specifier-list (Clause 10); the pattern is a base-specifier. 484fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregortemplate<typename ...Mixins> 494fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregorstruct HasMixins : public Mixins... { 50162e1c1b487352434552147967c3dd296ebee2f7Richard Smith HasMixins(); 514fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor HasMixins(const HasMixins&); 524fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor HasMixins(int i); 534fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor}; 54684aa73192d92850a926870be62a1787eb5b7ed9Michael Han 554fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregorstruct A { }; // expected-note{{candidate constructor (the implicit copy constructor) not viable: no known conversion from 'int' to 'const A' for 1st argument}} \ 568920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian// expected-note{{candidate constructor (the implicit move constructor) not viable: no known conversion from 'int' to 'A' for 1st argument}} \ 574fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// expected-note{{candidate constructor (the implicit default constructor) not viable: requires 0 arguments, but 1 was provided}} 584fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregorstruct B { }; 5957ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattnerstruct C { }; 604fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregorstruct D { }; 614fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor 6215de72cf580840c61e5704c2f8a2b56f9d0638e1Douglas GregorA *checkA = new HasMixins<A, B, C, D>; 6328ac87e1a22ee15f284643d9007640d25b1aab5bPeter CollingbourneB *checkB = new HasMixins<A, B, C, D>; 6459e63570359b8adb9eb257759fe766d7aac1995aDouglas GregorD *checkD = new HasMixins<A, B, C, D>; 658419fa3af97208eb00f0cd6c62354ce4ff986677Douglas 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> *'}} 666c9c94053132e5ca0655124b70f1c386a332e71dDouglas GregorHasMixins<> *checkNone = new HasMixins<>; 6759e63570359b8adb9eb257759fe766d7aac1995aDouglas Gregor 684fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregortemplate<typename Mixins> 6998a57868d696cb5faf6195a609ad084a711c6bbeRichard Smithstruct BrokenMixins : public Mixins... { }; // expected-error{{pack expansion does not contain any unexpanded parameter packs}} 705cb3d699f0e37de1767eb23d26d03953a46cf1ffRichard Trieu 715cb3d699f0e37de1767eb23d26d03953a46cf1ffRichard Trieu// In a mem-initializer-list (12.6.2); the pattern is a mem-initializer. 724fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregortemplate<typename ...Mixins> 734fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas GregorHasMixins<Mixins...>::HasMixins(): Mixins()... { } 744fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor 754fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregortemplate<typename ...Mixins> 764fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas GregorHasMixins<Mixins...>::HasMixins(const HasMixins &other): Mixins(other)... { } 774fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor 784fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregortemplate<typename ...Mixins> 794fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas GregorHasMixins<Mixins...>::HasMixins(int i): Mixins(i)... { } // expected-error{{no matching constructor for initialization of 'A'}} 804fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor 817ba107a1863ddfa1664555854f0d7bdb3c491c92John McCallvoid test_has_mixins() { 827ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall HasMixins<A, B> ab; 83f53eaa59c4936f9b095e69557ce7366b26ca90cbAnders Carlsson HasMixins<A, B> ab2 = ab; 849488ea120e093068021f944176c3d610dd540914John McCall HasMixins<A, B> ab3(17); // expected-note{{in instantiation of member function 'HasMixins<A, B>::HasMixins' requested here}} 85c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev} 865cb3d699f0e37de1767eb23d26d03953a46cf1ffRichard Trieu 875cb3d699f0e37de1767eb23d26d03953a46cf1ffRichard Trieutemplate<typename T> 886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct X { 891bea8807bcd2be10bf6309a3a848489434464cedDouglas Gregor T member; 904fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor 914fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor X() : member()... { } // expected-error{{pack expansion for initialization of member 'member'}} 924fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor}; 935cb3d699f0e37de1767eb23d26d03953a46cf1ffRichard Trieu 945cb3d699f0e37de1767eb23d26d03953a46cf1ffRichard Trieu// In a template-argument-list (14.3); the pattern is a template-argument. 9530c42404202d2e2512e51efc6066bd614cfdb5a4Douglas Gregortemplate<typename ...Types> 964fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregorstruct tuple_of_refs { 974fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor typedef tuple<Types& ...> types; 985f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner}; 995cb3d699f0e37de1767eb23d26d03953a46cf1ffRichard Trieu 100d1420c6fa788669e49f21e184927c7833881e399Richard Smithtuple<int&, float&> *t_int_ref_float_ref; 101f88df8652e0726fe9eee5d78f92e3c5b34d0a537Anders Carlssontuple_of_refs<int&, float&>::types *t_int_ref_float_ref_2 = t_int_ref_float_ref; 1024fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor 1034fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregortemplate<typename ...Types> 10442f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedmanstruct extract_nested_types { 10542f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman typedef tuple<typename Types::type...> types; 10642f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman}; 10742f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman 10842f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedmantuple<int, float> *t_int_float; 10942f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedmanextract_nested_types<identity<int>, identity<float> >::types *t_int_float_2 1106217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek = t_int_float; 11142f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman 11241c1f21c00d12f58a73199026b8041db9818988aTed Kremenektemplate<int ...N> 11341c1f21c00d12f58a73199026b8041db9818988aTed Kremenekstruct tuple_of_ints { 11442f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman typedef tuple<int_c<N>...> type; 11542f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman}; 116183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall 117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint check_temp_arg_1[is_same<tuple_of_ints<1, 2, 3, 4, 5>::type, 118183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall tuple<int_c<1>, int_c<2>, int_c<3>, int_c<4>, 1195068ab669970ba62020541251f1193b237d24ae3Douglas Gregor int_c<5>>>::value? 1 : -1]; 12015631b4d354d7fe99ad018de82a9d636d4bd8e92Eli Friedman 12115631b4d354d7fe99ad018de82a9d636d4bd8e92Eli Friedman// In a dynamic-exception-specification (15.4); the pattern is a type-id. 12242f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedmantemplate<typename ...Types> 123b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikiestruct f_with_except { 12442f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman virtual void f() throw(Types...); // expected-note{{overridden virtual function is here}} 12542f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman}; 12642f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman 12742f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedmanstruct check_f_with_except_1 : f_with_except<int, float> { 12842f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman virtual void f() throw(int, float); 129162e1c1b487352434552147967c3dd296ebee2f7Richard Smith}; 13042f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman 13142f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedmanstruct check_f_with_except_2 : f_with_except<int, float> { 13242f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman virtual void f() throw(int); 13342f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman}; 13442f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman 13542f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedmanstruct check_f_with_except_3 : f_with_except<int, float> { 13642f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman virtual void f() throw(int, float, double); // expected-error{{exception specification of overriding function is more lax than base version}} 1375f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner}; 13842f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman