1 // PR c++/53307
2 // { dg-do compile { target c++11 } }
3
4 template <class...Ts> struct tuple{};
5
6 struct funct
7 {
8 template <class T, class...argTs>
operatorfunct9 T operator()(T arg1, argTs...)
10 {
11 return arg1;
12 }
13 };
14
15 template <class...>class test;
16
17 template < template <class...> class tp,
18 class...arg1Ts,
19 class...arg2Ts>
20 class test<tp<arg1Ts...>, tp<arg2Ts...>>
21 {
22 public:
23 template <class func>
24 auto test_pass(func fun, arg2Ts...arg2s)
25 -> decltype(fun(arg2s...))
26 {
27 return fun(arg2s...);
28 }
29
30 template <class func, class...arg3Ts>
31 auto testbug(func fun, arg2Ts...arg2s, arg3Ts...arg3s)
32 -> decltype(fun(arg2s..., arg3s...))
33 {
34 return fun(arg2s..., arg3s...);
35 }
36 };
37
main()38 int main()
39 {
40 test<tuple<>, tuple<char, int>> t;
41 t.test_pass (funct(), 'a', 2);
42 t.testbug (funct(), 'a', 2, "fine");
43 t.testbug (funct(), 'a', 2);
44 }
45