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