The function std::char_traits::copy is implemented in libc++ like this:
template <class _CharT>
inline _LIBCPP_CONSTEXPR_AFTER_CXX17
_CharT*
char_traits<_CharT>::copy(char_type* __s1, const char_type* __s2, size_t __n)
{
if (!__libcpp_is_constant_evaluated()) {
_LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
}
char_type* __r = __s1;
for (; __n; --__n, ++__s1, ++__s2)
assign(*__s1, *__s2);
return __r;
}
The condition in _LIBCPP_ASSERT seems backwards. Shouldn't it be
__s1 < __s2 || __s1 >= __s2+__n
What am I missing?
It's not a bug, libc++ condition until C++23 is correct. std::char_traits::copy:
The behavior is undefined if copied character ranges overlap, i.e.
srcis in[dest, dest + count).
Bad: (src >= dest && src < dest + count)
Assert: !(src >= dest && src < dest + count) -> !(src >= dest) || !(src < dest + count) -> (src < dest) || (src >= dest + count) -> __s2 < __s1 || __s2 >= __s1 + __n.
The mathematical logic rule applied here: !(a && b) is !a || !b.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With