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);
}

Reply via email to