https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83542

            Bug ID: 83542
           Summary: template deduction failure when using pack in both
                    deduced and non-deduced contexts
           Product: gcc
           Version: 7.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: barry.revzin at gmail dot com
  Target Milestone: ---

This example fails to compile:

template <typename... T>
struct list { };

template <typename... T, typename... U>
void foo(list<T...>, list<U...>, void(*)(T..., U...))
{ }


void f(int, int ) { } 

int main()
{
    foo(list<int>{}, list<int>{}, &f);
}

on gcc 7.2. with:

foo.cxx: In function ‘int main()’:
foo.cxx:13:37: error: no matching function for call to ‘foo(list<int>,
list<int>, void (*)(int, int))’
     foo(list<int>{}, list<int>{}, &f);
                                     ^
foo.cxx:5:6: note: candidate: template<class ... T, class ... U> void
foo(list<T ...>, list<U ...>, void (*)(T ..., U ...))
 void foo(list<T...>, list<U...>, void(*)(T..., U...))
      ^~~
foo.cxx:5:6: note:   template argument deduction/substitution failed:
foo.cxx:13:37: note:   inconsistent parameter pack deduction with ‘’ and ‘’
     foo(list<int>{}, list<int>{}, &f);
                                     ^

But deduction should succeed - we can deduce T... and U... from the list<>
arguments. Additionally, the error message isn't very helpful. What do the ‘’s
refer to?

Reply via email to