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

--- Comment #16 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Ah gotcha.

So then something like this (untested):

--- a/libstdc++-v3/include/bits/stl_algobase.h
+++ b/libstdc++-v3/include/bits/stl_algobase.h
@@ -422,16 +422,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        static _Tp*
        __copy_m(const _Tp* __first, const _Tp* __last, _Tp* __result)
        {
-#if __cplusplus >= 201103L
-         using __assignable = __conditional_t<_IsMove,
-                                              is_move_assignable<_Tp>,
-                                              is_copy_assignable<_Tp>>;
-         // trivial types can have deleted assignment
-         static_assert( __assignable::value, "type must be assignable" );
-#endif
          const ptrdiff_t _Num = __last - __first;
-         if (_Num)
+         if (__builtin_expect(_Num > 1, true))
            __builtin_memmove(__result, __first, sizeof(_Tp) * _Num);
+         else if (_Num == 1)
+           return std::__copy_move<_IsMove, false,
+                                   random_access_iterator_tag>::
+                    __copy_m(__first, __last, __result);
          return __result + _Num;
        }
     };
@@ -737,16 +734,13 @@ _GLIBCXX_END_NAMESPACE_CONTAINER
        static _Tp*
        __copy_move_b(const _Tp* __first, const _Tp* __last, _Tp* __result)
        {
-#if __cplusplus >= 201103L
-         using __assignable = __conditional_t<_IsMove,
-                                              is_move_assignable<_Tp>,
-                                              is_copy_assignable<_Tp>>;
-         // trivial types can have deleted assignment
-         static_assert( __assignable::value, "type must be assignable" );
-#endif
          const ptrdiff_t _Num = __last - __first;
-         if (_Num)
+         if (__builtin_expect(_Num > 1, true))
            __builtin_memmove(__result - _Num, __first, sizeof(_Tp) * _Num);
+         else if (_Num == 1)
+           return std::__copy_move_backward<_IsMove, false,
+                                            random_access_iterator_tag>::
+                    __copy_move_b(__first, __last, __result);
          return __result - _Num;
        }
     };

Reply via email to