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)