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.

Reply via email to