https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103684
--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Reduced testcase: template <class T, class T1 = int, class T2 = int> struct f{}; template <class T, class T1 = int> struct g{}; template<template<typename, typename> class T> constexpr int hello() { return 2; } template<template<typename, typename, typename> class T> constexpr int hello() { return 3; } void foo() { auto i = hello<g>(); auto j = hello<f>(); } ----- CUT ----- I think clang here is wrong, MSVC and ICC both reject it for the same reason as GCC. Basically it looks like clang is not taking into account the default template arugments.