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