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