https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93059

Bernd Edlinger <bernd.edlinger at hotmail dot de> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |bernd.edlinger at hotmail dot 
de

--- Comment #26 from Bernd Edlinger <bernd.edlinger at hotmail dot de> ---
(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?

Reply via email to