@@ -967,23 +967,27 @@ _GLIBCXX_END_NAMESPACE_CONTAINER
#pragma GCC diagnostic pop
// Specialization: for char types we can use memset.
- template<typename _Tp>
+ template<typename _Up, typename _Tp>
_GLIBCXX20_CONSTEXPR
inline typename
- __gnu_cxx::__enable_if<__is_byte<_Tp>::__value, void>::__type
- __fill_a1(_Tp* __first, _Tp* __last, const _Tp& __c)
+ __gnu_cxx::__enable_if<__is_byte<_Up>::__value
+ && (__are_same<_Up, _Tp>::__value // for std::byte
+ || __memcpyable_integer<_Tp>::__value),
+ void>::__type
+ __fill_a1(_Up* __first, _Up* __last, const _Tp& __x)
{
- const _Tp __tmp = __c;
+ // This hoists the load out of the loop and also ensures that we don't
+ // use memset for cases where the assignment would be ill-formed.
+ const _Up __val = __x;
#if __cpp_lib_is_constant_evaluated
if (std::is_constant_evaluated())
{
for (; __first != __last; ++__first)
- *__first = __tmp;
- return;
+ *__first = __val;
}
#endif
if (const size_t __len = __last - __first)
- __builtin_memset(__first, static_cast<unsigned char>(__tmp), __len);
+ __builtin_memset(__first, static_cast<unsigned char>(__val), __len);
}
template<typename _Ite, typename _Cont, typename _Tp>