https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88378
Bug ID: 88378 Summary: notes for template deduction errors mention "[with U = U]" Product: gcc Version: 9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: msebor at gcc dot gnu.org Target Milestone: --- In error message like the one below where GCC fails to deduce the template argument GCC includes notes that print things like "[with U = U]" -- i.e., the template argument is the same as name of the parameter. It's only mildly confusing in this small test case but in real world code with more template parameters and where the names are much longer I suspect it makes the errors quite a bit harder to decipher. I think just skipping the "[with U = U]" when the deduction failed would be an improvement. $ cat t.C && gcc -S -Wall t.C template <class T> struct S { template <class U> void f (U*&); }; void g (S<int> s) { s.f (0); } t.C: In function ‘void g(S<int>)’: t.C:9:9: error: no matching function for call to ‘S<int>::f(int)’ 9 | s.f (0); | ^ t.C:4:8: note: candidate: ‘template<class U> void S<T>::f(U*&) [with U = U; T = int]’ 4 | void f (U*&); | ^ t.C:4:8: note: template argument deduction/substitution failed: t.C:9:9: note: mismatched types ‘U*’ and ‘int’ 9 | s.f (0); | ^ For comparison, Clang prints just: t.C:9:5: error: no matching member function for call to 'f' s.f (0); ~~^ t.C:4:8: note: candidate template ignored: could not match 'U *' against 'int' void f (U*&); ^ ICC prints: t.C(9): error: no instance of function template "S<T>::f [with T=int]" matches the argument list argument types are: (int) object type is: S<int> s.f (0); ^ t.C(4): note: this candidate was rejected because at least one template argument could not be deduced void f (U*&); ^ and MSVC: t.C(9): error C2672: 'S<int>::f': no matching overloaded function found t.C(9): error C2784: 'void S<int>::f(U *&)': could not deduce template argument for 'U *&' from 'int' t.C(4): note: see declaration of 'S<int>::f'