Hi, I'm adding the testcase and closing the PR as fixed. Tested x86_64-linux.
Thanks, Paolo. //////////////////////
2012-10-10 Paolo Carlini <paolo.carl...@oracle.com> PR c++/53307 * g++.dg/cpp0x/decltype44.C: New.
Index: g++.dg/cpp0x/decltype44.C =================================================================== --- g++.dg/cpp0x/decltype44.C (revision 0) +++ g++.dg/cpp0x/decltype44.C (working copy) @@ -0,0 +1,44 @@ +// PR c++/53307 +// { dg-do compile { target c++11 } } + +template <class...Ts> struct tuple{}; + +struct funct +{ + template <class T, class...argTs> + T operator()(T arg1, argTs...) + { + return arg1; + } +}; + +template <class...>class test; + +template < template <class...> class tp, + class...arg1Ts, + class...arg2Ts> +class test<tp<arg1Ts...>, tp<arg2Ts...>> +{ + public: + template <class func> + auto test_pass(func fun, arg2Ts...arg2s) + -> decltype(fun(arg2s...)) + { + return fun(arg2s...); + } + + template <class func, class...arg3Ts> + auto testbug(func fun, arg2Ts...arg2s, arg3Ts...arg3s) + -> decltype(fun(arg2s..., arg3s...)) + { + return fun(arg2s..., arg3s...); + } +}; + +int main() +{ + test<tuple<>, tuple<char, int>> t; + t.test_pass (funct(), 'a', 2); + t.testbug (funct(), 'a', 2, "fine"); + t.testbug (funct(), 'a', 2); +}