https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93059
--- Comment #4 from fdlbxtqi <euloanty at live dot com> ---
A demo fix would be like this i think:
template<std::input_iterator input_iter,std::input_iterator output_iter>
inline constexpr output_iter my_copy_n(input_iter first,std::size_t
count,output_iter result)
{
using input_value_type = typename
std::iterator_traits<input_iter>::value_type;
using output_value_type = typename
std::iterator_traits<output_iter>::value_type;
if constexpr
(std::contiguous_iterator<input_iter>&&
std::contiguous_iterator<output_iter>&&
std::is_trivially_copyable_v<input_value_type>&&
std::is_trivially_copyable_v<output_value_type>&&
(std::same_as<input_value_type,output_value_type>||(std::integral<input_value_type>&&
std::integral<output_value_type>&&sizeof(std::is_trivially_copyable_v<input_value_type>)==sizeof(std::is_trivially_copyable_v<output_value_type>))))
{
if (std::is_constant_evaluated())
{
for(;count--;)
{
*result=*first;
++first;
++result;
}
}
else
__builtin_memmove(std::to_address(result),std::to_address(first),
sizeof(typename
std::iterator_traits<input_iter>::value_type)*count);
return result+count;
}
return std::copy_n(first,count,result);
}