@@ -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);
@@ -460,7 +460,11 @@ template <class __T, size_t __N> struct __non_trivial {
460460 constexpr __non_trivial &operator =(__non_trivial const &) noexcept = default ;
461461 constexpr __non_trivial (__non_trivial &&) noexcept = default;
462462 constexpr __non_trivial &operator =(__non_trivial &&) noexcept = default ;
463- constexpr ~__non_trivial () = default ;
463+
464+ constexpr ~__non_trivial ()
465+ requires (is_trivially_destructible_v<__T>)
466+ = default ;
467+ constexpr ~__non_trivial () { destroy (__data (), __data () + __size ()); }
464468};
465469
466470// Selects the vector storage.
@@ -501,7 +505,7 @@ struct inplace_vector : private __iv_detail::__storage::_t<__T, __N> {
501505 using const_reverse_iterator = ::std::reverse_iterator<const_iterator>;
502506
503507 // [containers.sequences.inplace_vector.cons], construct/copy/destroy
504- constexpr inplace_vector () noexcept { __unsafe_set_size ( 0 ); }
508+ constexpr inplace_vector () noexcept = default;
505509 // constexpr explicit inplace_vector(size_type __n);
506510 // constexpr inplace_vector(size_type __n, const __T& __value);
507511 // template <class __InputIterator> // BUGBUG: why not model input_iterator?
@@ -695,11 +699,12 @@ struct inplace_vector : private __iv_detail::__storage::_t<__T, __N> {
695699 }
696700
697701 template <class ... __Args>
698- constexpr void emplace_back (__Args &&...__args)
702+ constexpr __T & emplace_back (__Args &&...__args)
699703 requires(constructible_from<__T, __Args...>)
700704 {
701705 if (!try_emplace_back (::std::forward<__Args>(__args)...)) [[unlikely]]
702706 throw bad_alloc ();
707+ return back ();
703708 }
704709 constexpr __T &push_back (const __T &__x)
705710 requires(constructible_from<__T, const __T &>)
@@ -770,7 +775,8 @@ struct inplace_vector : private __iv_detail::__storage::_t<__T, __N> {
770775 movable<__T>)
771776 {
772777 __assert_iterator_in_range (__position);
773- __assert_valid_iterator_pair (__first, __last);
778+ // __assert_valid_iterator_pair(__first, __last); // does not work with
779+ // arbitrary InputIterators
774780 if constexpr (random_access_iterator<__InputIterator>) {
775781 if (size () + static_cast <size_type>(distance (__first, __last)) >
776782 capacity ()) [[unlikely]]
@@ -935,27 +941,60 @@ struct inplace_vector : private __iv_detail::__storage::_t<__T, __N> {
935941 }
936942
937943 constexpr inplace_vector (const inplace_vector &__x)
938- requires(copyable<__T>)
944+ requires(__N == 0 || is_trivially_copy_constructible_v<__T>)
945+ = default;
946+
947+ constexpr inplace_vector (const inplace_vector &__x)
948+ requires(__N != 0 && !is_trivially_copy_constructible_v<__T> &&
949+ copyable<__T>)
939950 {
940951 for (auto &&__e : __x)
941952 emplace_back (__e);
942953 }
954+
943955 constexpr inplace_vector (inplace_vector &&__x)
944- requires(movable<__T>)
956+ requires(__N == 0 || is_trivially_move_constructible_v<__T>)
957+ = default;
958+
959+ constexpr inplace_vector (inplace_vector &&__x)
960+ requires(__N != 0 && !is_trivially_move_constructible_v<__T> &&
961+ movable<__T>)
945962 {
946963 for (auto &&__e : __x)
947964 emplace_back (::std::move (__e));
948965 }
966+
949967 constexpr inplace_vector &operator =(const inplace_vector &__x)
950- requires (copyable<__T>)
968+ requires (__N == 0 || (std::is_trivially_destructible_v<__T> &&
969+ std::is_trivially_copy_constructible_v<__T> &&
970+ std::is_trivially_copy_assignable_v<__T>))
971+ = default ;
972+
973+ constexpr inplace_vector &operator =(const inplace_vector &__x)
974+ requires (__N != 0 &&
975+ !(std::is_trivially_destructible_v<__T> &&
976+ std::is_trivially_copy_constructible_v<__T> &&
977+ std::is_trivially_copy_assignable_v<__T>) &&
978+ copyable<__T>)
951979 {
952980 clear ();
953981 for (auto &&__e : __x)
954982 emplace_back (__e);
955983 return *this ;
956984 }
985+
957986 constexpr inplace_vector &operator =(inplace_vector &&__x)
958- requires (movable<__T>)
987+ requires (__N == 0 || (std::is_trivially_destructible_v<__T> &&
988+ std::is_trivially_move_constructible_v<__T> &&
989+ std::is_trivially_move_assignable_v<__T>))
990+ = default ;
991+
992+ constexpr inplace_vector &operator =(inplace_vector &&__x)
993+ requires (__N != 0 &&
994+ !(std::is_trivially_destructible_v<__T> &&
995+ std::is_trivially_move_constructible_v<__T> &&
996+ std::is_trivially_move_assignable_v<__T>) &&
997+ movable<__T>)
959998 {
960999 clear ();
9611000 for (auto &&__e : __x)
@@ -986,7 +1025,7 @@ struct inplace_vector : private __iv_detail::__storage::_t<__T, __N> {
9861025 requires(constructible_from<__T, ranges::range_reference_t <__R>> &&
9871026 movable<__T>)
9881027 {
989- assign (begin (__rg), end (__rg));
1028+ assign (std:: begin (__rg), std:: end (__rg));
9901029 }
9911030 constexpr void assign (size_type __n, const __T &__u)
9921031 requires(constructible_from<__T, const __T &> && movable<__T>)
0 commit comments