https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93059
--- Comment #27 from fdlbxtqi <euloanty at live dot com> ---
(In reply to Bernd Edlinger from comment #26)
> (In reply to fdlbxtqi from comment #2)
> > Also find a bug of __memmove
> >
> > /*
> > * A constexpr wrapper for __builtin_memmove.
> > * @param __num The number of elements of type _Tp (not bytes).
> > */
> > template<bool _IsMove, typename _Tp>
> > _GLIBCXX14_CONSTEXPR
> > inline void*
> > __memmove(_Tp* __dst, const _Tp* __src, size_t __num)
> > {
> > #ifdef __cpp_lib_is_constant_evaluated
> > if (std::is_constant_evaluated())
> > {
> > for(; __num > 0; --__num)
> > {
> > if constexpr (_IsMove)
> > *__dst = std::move(*__src);
> > else
> > *__dst = *__src;
> > ++__src;
> > ++__dst;
> > }
> > return __dst;
> > }
> > else
> > #endif
> > return __builtin_memmove(__dst, __src, sizeof(_Tp) * __num);
> > return __dst;
> > }
> >
> > The last 2nd line return __dst is wrong. It should not exist.
>
> Sorry, I don't know what this function is all about.
> But to me the code in the ifdef looks totally bogus.
> First it returns __dst+__num, while memmove is sopposed
> to return __dst, and is is somehow clear that
> __dst and __src do not overlap?
>
> because if they do the loop would overwite the __dst buffer before
> __src is fully copied?
Nope. It is C++20's new feature if(std::is_constant_evaluated()) which allows
you to write functions can be used both in compile and runtime.