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.