Skip to content

Commit 81903c2

Browse files
committed
Fix Triviality/ZeroSized
1 parent ef169f9 commit 81903c2

File tree

2 files changed

+16
-8
lines changed

2 files changed

+16
-8
lines changed

include/beman/inplace_vector/inplace_vector.hpp

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -504,7 +504,7 @@ struct inplace_vector : private __iv_detail::__storage::_t<__T, __N> {
504504
using const_reverse_iterator = ::std::reverse_iterator<const_iterator>;
505505

506506
// [containers.sequences.inplace_vector.cons], construct/copy/destroy
507-
constexpr inplace_vector() noexcept { __unsafe_set_size(0); }
507+
constexpr inplace_vector() noexcept = default;
508508
// constexpr explicit inplace_vector(size_type __n);
509509
// constexpr inplace_vector(size_type __n, const __T& __value);
510510
// template <class __InputIterator> // BUGBUG: why not model input_iterator?
@@ -938,28 +938,35 @@ struct inplace_vector : private __iv_detail::__storage::_t<__T, __N> {
938938
__unsafe_set_size(size() - 1);
939939
}
940940

941+
constexpr inplace_vector(const inplace_vector &__x) requires(__N == 0) = default;
941942
constexpr inplace_vector(const inplace_vector &__x)
942-
requires(copyable<__T>)
943+
requires(__N != 0 && copyable<__T>)
943944
{
944945
for (auto &&__e : __x)
945946
emplace_back(__e);
946947
}
948+
949+
constexpr inplace_vector(inplace_vector &&__x) requires(__N == 0) = default;
947950
constexpr inplace_vector(inplace_vector &&__x)
948-
requires(movable<__T>)
951+
requires(__N != 0 && movable<__T>)
949952
{
950953
for (auto &&__e : __x)
951954
emplace_back(::std::move(__e));
952955
}
956+
957+
constexpr inplace_vector &operator=(const inplace_vector &__x) requires(__N == 0) = default;
953958
constexpr inplace_vector &operator=(const inplace_vector &__x)
954-
requires(copyable<__T>)
959+
requires(__N != 0 && copyable<__T>)
955960
{
956961
clear();
957962
for (auto &&__e : __x)
958963
emplace_back(__e);
959964
return *this;
960965
}
966+
967+
constexpr inplace_vector &operator=(inplace_vector &&__x) requires(__N == 0) = default;
961968
constexpr inplace_vector &operator=(inplace_vector &&__x)
962-
requires(movable<__T>)
969+
requires(__N != 0 && movable<__T>)
963970
{
964971
clear();
965972
for (auto &&__e : __x)

tests/beman/inplace_vector/spec.test.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -991,9 +991,10 @@ TYPED_TEST(ReversibleContainerRequirements, REnd) {
991991
template <typename Param> class Triviality : public BasicTest<Param> {};
992992
TYPED_TEST_SUITE(Triviality, AllTypes);
993993

994-
TYPED_TEST(Triviality, TrivialDefaultConstructible) {
995-
// (6.1) — If is_trivially_copy_constructible_v<T> is true, then IV has a
996-
// trivial copy constructor
994+
TYPED_TEST(Triviality, ZeroSized) {
995+
// 6 Let IV denote a specialization of inplace_vector<T, N>.
996+
// If N is zero, then IV is trivially copyable and empty, and
997+
// std::is_trivially_default_constructible_v<IV> is true.
997998

998999
using T = TestFixture::T;
9991000
constexpr auto N = TestFixture::N;

0 commit comments

Comments
 (0)