Clang неправильно отклонить частичную специализацию. Чтобы узнать, как интерпретировать сообщение об ошибке, вам необходимо понять, что диагностирует Clang. Это означает диагностировать частичную специализацию, аргументы которой точно соответствуют списку неявных аргументов шаблона первичного класса (<param1, param2, ... , paramN>
).
Однако списки аргументов отличаются, поэтому clang не должен их диагностировать. В частности, это не имеет ничего общего, если частичная специализация соответствует более или менее аргументам. Рассмотрим
template<typename A, typename B> class C;
template<typename B, typename A> class C<A, B> {};
Частичная специализация здесь соответствует всему, а не больше, чем основной шаблон. И списки аргументов обоих шаблонов разные, поэтому эта частичная специализация действительна, как и вы.