diff --git a/libcxx/include/bitset b/libcxx/include/bitset index e2b46154ae730..3453c2fcde71e 100644 --- a/libcxx/include/bitset +++ b/libcxx/include/bitset @@ -867,7 +867,16 @@ bitset<_Size>::to_string(char __zero, char __one) const { template inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 size_t bitset<_Size>::count() const _NOEXCEPT { - return static_cast(std::count(__base::__make_iter(0), __base::__make_iter(_Size), true)); +# if defined(_LIBCPP_COMPILER_CLANG_BASED) && !defined(_LIBCPP_CXX03_LANG) + if constexpr (_Size == 0) { + return 0; + } else if constexpr (_Size <= __base::__bits_per_word) { + return __builtin_popcountg(static_cast(__base::__first_)); + } else +# endif + { + return static_cast(std::count(__base::__make_iter(0), __base::__make_iter(_Size), true)); + } } template