1 // Various tests for variadic templates and partial specialization.
2 // { dg-do compile { target c++11 } }
3 
4 // PR c++/36846
5 template<typename A, typename B>
6 struct pair;
7 
8 template<typename... T>
9 struct pairs;
10 
11 template<typename... AS, typename... BS>
12 struct pairs<pair<AS, BS>...> {
13   struct mismatched_packs {};
14 };
15 
16 template class pairs<
17   pair<int, int>,
18   pair<int, int>
19 >;
20 
21 template<int A, int B>
22 struct point;
23 
24 template<typename... T>
25 struct points;
26 
27 template<int... AS, int... BS>
28 struct points<point<AS, BS>...> {
29   struct mismatched_packs {};
30 };
31 
32 template class points<
33   point<0, 1>,
34   point<0, 1>
35 >;
36 
37 // PR c++/35477
38 template <class...ARGS> struct tuple {};
39 template <class A, class B> struct test {};
40 template <class... ARGS, class B> struct test<B, tuple<ARGS...>>
41 {
42     template <class T> struct inside {};
43 };
44 
45 // PR c++/38276
46 template<typename...> struct A;
47 
48 template<typename, typename> struct B;
49 
50 template<typename... T, typename... U> struct B<A<T...>, A<U...> >
51 {
52   static int i;
53 };
54 
55 B<A<>, A<int> > b1;
56 
57 B<A<int>, A<> > b2;
58 
59 // PR c++/35784
60 template <typename...> struct p;
61 
62 template <typename, typename> struct d;
63 
64 template <typename... A, typename... B>
65 struct d<p<A...>, p<B...> > { typedef int t; };
66 
67 typedef d<p<>, p<int, float> >::t q;
68 typedef d<q, d<p<int>, p<float> >::t> r; // *
69 
70 typedef d<d<p<>, p<int, float> >::t, d<p<>, p<> >::t> s;
71