https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101707
Bug ID: 101707 Summary: deduction of template argument fails via base class Product: gcc Version: 11.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: baber.nwz at gmail dot com Target Milestone: --- The following program fails to compile with GCC 11.2 but compiles with clang (from version 12 to 3), MSVC (2015, 2017, 2019) and ICC: template<typename T> struct S {}; struct A : S<int> {}; struct B : S<float> {}; struct C : A, B, S<double> {}; template<typename T, template <typename> class TPL> void f(TPL<T>& a) { } void g() { A a; B b; C c; f<int>(a); // OK f<float>(b); // OK f<double>(c); // ERROR } The compiler gives the following output: source>: In function 'void g()': <source>:21:14: error: no matching function for call to 'f<double>(C&)' 21 | f<double>(c); | ~~~~~~~~~^~~ <source>:9:6: note: candidate: 'template<class T, template<class> class TPL> void f(TPL<T>&)' 9 | void f(TPL<T>& a) | ^ <source>:9:6: note: template argument deduction/substitution failed: <source>:21:14: note: 'TPL<T>' is an ambiguous base class of 'C' 21 | f<double>(c); | ~~~~~~~~~^~~ With the supplied template parameter (double), the base class is definitely not ambiguous. https://godbolt.org/z/EKn16o46a