@@ -313,7 +313,7 @@ template <class = void>
313313[[noreturn]]
314314static constexpr void __assert_failure (char const *__file, int __line,
315315 char const *__msg) {
316- if consteval {
316+ if ( std::is_constant_evaluated ()) {
317317 throw __msg; // TODO: std lib implementer, do better here
318318 } else {
319319 std::fprintf (stderr, " %s(%d): %s\n " , __file, __line, __msg);
@@ -462,7 +462,11 @@ template <class __T, size_t __N> struct __non_trivial {
462462 constexpr __non_trivial &operator =(__non_trivial const &) noexcept = default ;
463463 constexpr __non_trivial (__non_trivial &&) noexcept = default;
464464 constexpr __non_trivial &operator =(__non_trivial &&) noexcept = default ;
465- constexpr ~__non_trivial () = default ;
465+
466+ constexpr ~__non_trivial ()
467+ requires (is_trivially_destructible_v<__T>)
468+ = default ;
469+ constexpr ~__non_trivial () { destroy (__data (), __data () + __size ()); }
466470};
467471
468472// Selects the vector storage.
@@ -502,7 +506,7 @@ struct inplace_vector : private __iv_detail::__storage::_t<__T, __N> {
502506 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
503507
504508 // [containers.sequences.inplace_vector.cons], construct/copy/destroy
505- constexpr inplace_vector () noexcept { __unsafe_set_size ( 0 ); }
509+ constexpr inplace_vector () noexcept = default;
506510 // constexpr explicit inplace_vector(size_type __n);
507511 // constexpr inplace_vector(size_type __n, const __T& __value);
508512 // template <class __InputIterator> // BUGBUG: why not model input_iterator?
@@ -697,11 +701,12 @@ struct inplace_vector : private __iv_detail::__storage::_t<__T, __N> {
697701 }
698702
699703 template <class ... __Args>
700- constexpr void emplace_back (__Args &&...__args)
704+ constexpr T & emplace_back (__Args &&...__args)
701705 requires(std::constructible_from<__T, __Args...>)
702706 {
703707 if (!try_emplace_back (std::forward<__Args>(__args)...)) [[unlikely]]
704708 throw std::bad_alloc ();
709+ return back ();
705710 }
706711 constexpr __T &push_back (const __T &__x)
707712 requires(std::constructible_from<__T, const __T &>)
@@ -773,7 +778,6 @@ struct inplace_vector : private __iv_detail::__storage::_t<__T, __N> {
773778 std::movable<__T>)
774779 {
775780 __assert_iterator_in_range (__position);
776- __assert_valid_iterator_pair (__first, __last);
777781 if constexpr (std::random_access_iterator<__InputIterator>) {
778782 if (size () + static_cast <size_type>(std::distance (__first, __last)) >
779783 capacity ()) [[unlikely]]
@@ -945,27 +949,60 @@ struct inplace_vector : private __iv_detail::__storage::_t<__T, __N> {
945949 }
946950
947951 constexpr inplace_vector (const inplace_vector &__x)
948- requires(std::copyable<__T>)
952+ requires(__N == 0 || std::is_trivially_copy_constructible_v<__T>)
953+ = default;
954+
955+ constexpr inplace_vector (const inplace_vector &__x)
956+ requires(__N != 0 && !std::is_trivially_copy_constructible_v<__T> &&
957+ copyable<__T>)
949958 {
950959 for (auto &&__e : __x)
951960 emplace_back (__e);
952961 }
962+
953963 constexpr inplace_vector (inplace_vector &&__x)
954- requires(std::movable<__T>)
964+ requires(__N == 0 || std::is_trivially_move_constructible_v<__T>)
965+ = default;
966+
967+ constexpr inplace_vector (inplace_vector &&__x)
968+ requires(__N != 0 && !std::is_trivially_move_constructible_v<__T> &&
969+ std::movable<__T>)
955970 {
956971 for (auto &&__e : __x)
957972 emplace_back (std::move (__e));
958973 }
974+
975+ constexpr inplace_vector &operator =(const inplace_vector &__x)
976+ requires (__N == 0 || (std::is_trivially_destructible_v<__T> &&
977+ std::is_trivially_copy_constructible_v<__T> &&
978+ std::is_trivially_copy_assignable_v<__T>))
979+ = default ;
980+
959981 constexpr inplace_vector &operator =(const inplace_vector &__x)
960- requires (std::copyable<__T>)
982+ requires (__N != 0 &&
983+ !(std::is_trivially_destructible_v<__T> &&
984+ std::is_trivially_copy_constructible_v<__T> &&
985+ std::is_trivially_copy_assignable_v<__T>) &&
986+ std::copyable<__T>)
961987 {
962988 clear ();
963989 for (auto &&__e : __x)
964990 emplace_back (__e);
965991 return *this ;
966992 }
993+
967994 constexpr inplace_vector &operator =(inplace_vector &&__x)
968- requires (std::movable<__T>)
995+ requires (__N == 0 || (std::is_trivially_destructible_v<__T> &&
996+ std::is_trivially_move_constructible_v<__T> &&
997+ std::is_trivially_move_assignable_v<__T>))
998+ = default ;
999+
1000+ constexpr inplace_vector &operator =(inplace_vector &&__x)
1001+ requires (__N != 0 &&
1002+ !(std::is_trivially_destructible_v<__T> &&
1003+ std::is_trivially_move_constructible_v<__T> &&
1004+ std::is_trivially_move_assignable_v<__T>) &&
1005+ std::movable<__T>)
9691006 {
9701007 clear ();
9711008 for (auto &&__e : __x)
0 commit comments