@@ -323,6 +323,18 @@ static constexpr void __assert_failure(char const *__file, int __line,
323323using namespace std ;
324324using namespace beman ::__iv_detail;
325325
326+ template <typename __T>
327+ concept __trivial_copy_assignment =
328+ (std::is_trivially_destructible_v<__T> &&
329+ std::is_trivially_copy_constructible_v<__T> &&
330+ std::is_trivially_copy_assignable_v<__T>);
331+
332+ template <typename __T>
333+ concept __trivial_move_assignment =
334+ (std::is_trivially_destructible_v<__T> &&
335+ std::is_trivially_move_constructible_v<__T> &&
336+ std::is_trivially_move_assignable_v<__T>);
337+
326338// clang-format off
327339// Smallest unsigned integer that can represent values in [0, N].
328340template <size_t __N>
@@ -939,30 +951,36 @@ struct inplace_vector : private __iv_detail::__storage::_t<__T, __N> {
939951 }
940952
941953 constexpr inplace_vector (const inplace_vector &__x)
942- requires(__N == 0 )
954+ requires(__N == 0 || is_trivially_copy_constructible_v<__T> )
943955 = default;
956+
944957 constexpr inplace_vector (const inplace_vector &__x)
945- requires(__N != 0 && copyable<__T>)
958+ requires(__N != 0 && !is_trivially_copy_constructible_v<__T> &&
959+ copyable<__T>)
946960 {
947961 for (auto &&__e : __x)
948962 emplace_back (__e);
949963 }
950964
951965 constexpr inplace_vector (inplace_vector &&__x)
952- requires(__N == 0 )
966+ requires(__N == 0 || is_trivially_move_constructible_v<__T> )
953967 = default;
968+
954969 constexpr inplace_vector (inplace_vector &&__x)
955- requires(__N != 0 && movable<__T>)
970+ requires(__N != 0 && !is_trivially_move_constructible_v<__T> &&
971+ movable<__T>)
956972 {
957973 for (auto &&__e : __x)
958974 emplace_back (::std::move (__e));
959975 }
960976
961977 constexpr inplace_vector &operator =(const inplace_vector &__x)
962- requires (__N == 0 )
978+ requires (__N == 0 || __iv_detail::__trivial_copy_assignment<__T> )
963979 = default ;
980+
964981 constexpr inplace_vector &operator =(const inplace_vector &__x)
965- requires (__N != 0 && copyable<__T>)
982+ requires (__N != 0 && !__iv_detail::__trivial_copy_assignment<__T> &&
983+ copyable<__T>)
966984 {
967985 clear ();
968986 for (auto &&__e : __x)
@@ -971,10 +989,12 @@ struct inplace_vector : private __iv_detail::__storage::_t<__T, __N> {
971989 }
972990
973991 constexpr inplace_vector &operator =(inplace_vector &&__x)
974- requires (__N == 0 )
992+ requires (__N == 0 || __iv_detail::__trivial_move_assignment<__T> )
975993 = default ;
994+
976995 constexpr inplace_vector &operator =(inplace_vector &&__x)
977- requires (__N != 0 && movable<__T>)
996+ requires (__N != 0 && !__iv_detail::__trivial_move_assignment<__T> &&
997+ movable<__T>)
978998 {
979999 clear ();
9801000 for (auto &&__e : __x)
0 commit comments