https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101137
--- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> --- I get the same behaviour if I replace all uses of std::conjunction with fold expressions and split up your unreadable long lines into simpler atoms (which also makes the code much simpler) e.g. template<typename T> concept SignedIntegral1 = std::is_integral_v<T> && std::is_signed_v<T>; template<typename T> concept SignedIntegralRef1 = std::is_lvalue_reference_v<T> && SignedIntegral1<T>; template<typename... T> concept SignedIntegral = ((SignedIntegral1<T> || SignedIntegralRef1<T>) && ...); I think the problem is a simple typo in your is_signed_integral_convert_copy trait, you use boost::mp11::mp_first<T2<Args1...>> ^ Presumably that's supposed to be boost::mp11::mp_first<T2<Args2...>>. ^