From 8c79ca7016f3216b9380b1e35f006d69f6663aba Mon Sep 17 00:00:00 2001 From: Arthur O'Dwyer Date: Sun, 25 Aug 2024 09:48:36 -0400 Subject: [PATCH] [test] Move NoexceptnessOfSwap into individual aa_inplace_vector tests --- test/aa_inplace_vector_pmr_test.cpp | 38 ++++++++++++++++++-- test/aa_inplace_vector_smallsize_test.cpp | 9 +++++ test/aa_inplace_vector_stdallocator_test.cpp | 9 +++++ test/inplace_vector_common_tests.cpp | 9 +---- test/inplace_vector_test.cpp | 9 +++++ 5 files changed, 64 insertions(+), 10 deletions(-) diff --git a/test/aa_inplace_vector_pmr_test.cpp b/test/aa_inplace_vector_pmr_test.cpp index 6fc17b7..6d43f2b 100644 --- a/test/aa_inplace_vector_pmr_test.cpp +++ b/test/aa_inplace_vector_pmr_test.cpp @@ -32,6 +32,7 @@ TEST(IPV_TEST_NAME, TrivialTraits) static_assert(std::is_nothrow_copy_assignable_v); static_assert(std::is_nothrow_move_assignable_v); static_assert(std::is_nothrow_destructible_v); + static_assert(std::is_nothrow_swappable_v); #if defined(__cpp_lib_trivially_relocatable) static_assert(!std::is_trivially_relocatable_v); #endif // __cpp_lib_trivially_relocatable @@ -44,11 +45,39 @@ TEST(IPV_TEST_NAME, TrivialTraits) static_assert(!std::is_trivially_copy_assignable_v); static_assert(!std::is_trivially_move_assignable_v); static_assert(!std::is_trivially_destructible_v); - static_assert(!std::is_nothrow_copy_constructible_v); - static_assert(!std::is_nothrow_move_constructible_v); // because pmr::vector isn't nothrow move-assignable + static_assert(!std::is_nothrow_copy_constructible_v); // because T(const T&, Alloc) is throwing + static_assert(!std::is_nothrow_move_constructible_v); // because T(T&&, Alloc) is throwing static_assert(!std::is_nothrow_copy_assignable_v); static_assert(!std::is_nothrow_move_assignable_v); static_assert(std::is_nothrow_destructible_v); + static_assert(!std::is_nothrow_swappable_v); // because T::operator= is throwing +#if defined(__cpp_lib_trivially_relocatable) + static_assert(!std::is_trivially_relocatable_v); +#endif // __cpp_lib_trivially_relocatable + } + { + // Test with a type that is trivial, but still cares about the value + // of the allocator with which it's constructed. + // + struct Dummy { + using allocator_type = std::pmr::polymorphic_allocator; + explicit Dummy(allocator_type) noexcept; + explicit Dummy(Dummy&&, allocator_type) noexcept; + explicit Dummy(const Dummy&, allocator_type) noexcept; + }; + using T = sg14::pmr::inplace_vector, 10>; + static_assert(!std::is_trivially_copyable_v); + static_assert(!std::is_trivially_copy_constructible_v); + static_assert(!std::is_trivially_move_constructible_v); + static_assert(!std::is_trivially_copy_assignable_v); + static_assert(!std::is_trivially_move_assignable_v); + static_assert(!std::is_trivially_destructible_v); + static_assert(!std::is_nothrow_copy_constructible_v); // because A::construct is throwing + static_assert(!std::is_nothrow_move_constructible_v); // because A::construct is throwing + static_assert(!std::is_nothrow_copy_assignable_v); // because A::construct is throwing + static_assert(!std::is_nothrow_move_assignable_v); // because A::construct is throwing + static_assert(std::is_nothrow_destructible_v); + static_assert(!std::is_nothrow_swappable_v); // because A::construct is throwing #if defined(__cpp_lib_trivially_relocatable) static_assert(!std::is_trivially_relocatable_v); #endif // __cpp_lib_trivially_relocatable @@ -66,6 +95,7 @@ TEST(IPV_TEST_NAME, TrivialTraits) static_assert(!std::is_copy_assignable_v); static_assert(std::is_nothrow_move_assignable_v); static_assert(std::is_nothrow_destructible_v); + static_assert(std::is_nothrow_swappable_v); #if defined(__cpp_lib_trivially_relocatable) static_assert(!std::is_trivially_relocatable_v); #endif // __cpp_lib_trivially_relocatable @@ -83,6 +113,7 @@ TEST(IPV_TEST_NAME, TrivialTraits) static_assert(!std::is_copy_assignable_v); static_assert(std::is_nothrow_move_assignable_v); static_assert(std::is_nothrow_destructible_v); + static_assert(std::is_nothrow_swappable_v); #if defined(__cpp_lib_trivially_relocatable) static_assert(!std::is_trivially_relocatable_v); #endif // __cpp_lib_trivially_relocatable @@ -100,6 +131,7 @@ TEST(IPV_TEST_NAME, TrivialTraits) static_assert(std::is_nothrow_copy_assignable_v); static_assert(std::is_nothrow_move_assignable_v); static_assert(std::is_nothrow_destructible_v); + static_assert(std::is_nothrow_swappable_v); #if defined(__cpp_lib_trivially_relocatable) static_assert(!std::is_trivially_relocatable_v); #endif // __cpp_lib_trivially_relocatable @@ -117,6 +149,7 @@ TEST(IPV_TEST_NAME, TrivialTraits) static_assert(std::is_nothrow_copy_assignable_v); static_assert(std::is_nothrow_move_assignable_v); static_assert(std::is_nothrow_destructible_v); + static_assert(std::is_nothrow_swappable_v); #if defined(__cpp_lib_trivially_relocatable) static_assert(!std::is_trivially_relocatable_v); #endif // __cpp_lib_trivially_relocatable @@ -134,6 +167,7 @@ TEST(IPV_TEST_NAME, TrivialTraits) static_assert(!std::is_copy_assignable_v); static_assert(std::is_nothrow_move_assignable_v); static_assert(std::is_nothrow_destructible_v); + static_assert(std::is_nothrow_swappable_v); #if defined(__cpp_lib_trivially_relocatable) static_assert(!std::is_trivially_relocatable_v); #endif // __cpp_lib_trivially_relocatable diff --git a/test/aa_inplace_vector_smallsize_test.cpp b/test/aa_inplace_vector_smallsize_test.cpp index 2f76aaf..af1d3af 100644 --- a/test/aa_inplace_vector_smallsize_test.cpp +++ b/test/aa_inplace_vector_smallsize_test.cpp @@ -39,6 +39,7 @@ TEST(IPV_TEST_NAME, TrivialTraits) static_assert(std::is_nothrow_copy_assignable_v); static_assert(std::is_nothrow_move_assignable_v); static_assert(std::is_nothrow_destructible_v); + static_assert(std::is_nothrow_swappable_v); #if defined(__cpp_lib_trivially_relocatable) static_assert(std::is_trivially_relocatable_v); #endif // __cpp_lib_trivially_relocatable @@ -56,6 +57,7 @@ TEST(IPV_TEST_NAME, TrivialTraits) static_assert(!std::is_nothrow_copy_assignable_v); static_assert(std::is_nothrow_move_assignable_v); static_assert(std::is_nothrow_destructible_v); + static_assert(std::is_nothrow_swappable_v); #if defined(__cpp_lib_trivially_relocatable) static_assert(std::is_trivially_relocatable_v); #endif // __cpp_lib_trivially_relocatable @@ -74,6 +76,7 @@ TEST(IPV_TEST_NAME, TrivialTraits) static_assert(!std::is_nothrow_copy_assignable_v); static_assert(std::is_nothrow_move_assignable_v == !msvc); static_assert(std::is_nothrow_destructible_v); + static_assert(std::is_nothrow_swappable_v); #if defined(__cpp_lib_trivially_relocatable) static_assert(std::is_trivially_relocatable_v == msvc); #endif // __cpp_lib_trivially_relocatable @@ -91,6 +94,7 @@ TEST(IPV_TEST_NAME, TrivialTraits) static_assert(!std::is_copy_assignable_v); static_assert(std::is_nothrow_move_assignable_v); static_assert(std::is_nothrow_destructible_v); + static_assert(std::is_nothrow_swappable_v); #if defined(__cpp_lib_trivially_relocatable) static_assert(std::is_trivially_relocatable_v); #endif // __cpp_lib_trivially_relocatable @@ -108,6 +112,7 @@ TEST(IPV_TEST_NAME, TrivialTraits) static_assert(!std::is_copy_assignable_v); static_assert(std::is_nothrow_move_assignable_v); static_assert(std::is_nothrow_destructible_v); + static_assert(std::is_nothrow_swappable_v); #if defined(__cpp_lib_trivially_relocatable) static_assert(!std::is_trivially_relocatable_v); #endif // __cpp_lib_trivially_relocatable @@ -125,6 +130,7 @@ TEST(IPV_TEST_NAME, TrivialTraits) static_assert(std::is_nothrow_copy_assignable_v); static_assert(std::is_nothrow_move_assignable_v); static_assert(std::is_nothrow_destructible_v); + static_assert(std::is_nothrow_swappable_v); #if defined(__cpp_lib_trivially_relocatable) static_assert(std::is_trivially_relocatable_v); #endif // __cpp_lib_trivially_relocatable @@ -142,6 +148,7 @@ TEST(IPV_TEST_NAME, TrivialTraits) static_assert(std::is_nothrow_copy_assignable_v); static_assert(std::is_nothrow_move_assignable_v); static_assert(std::is_nothrow_destructible_v); + static_assert(std::is_nothrow_swappable_v); #if defined(__cpp_lib_trivially_relocatable) static_assert(std::is_trivially_relocatable_v); #endif // __cpp_lib_trivially_relocatable @@ -159,6 +166,7 @@ TEST(IPV_TEST_NAME, TrivialTraits) static_assert(std::is_nothrow_copy_assignable_v); static_assert(std::is_nothrow_move_assignable_v); static_assert(std::is_nothrow_destructible_v); + static_assert(std::is_nothrow_swappable_v); #if defined(__cpp_lib_trivially_relocatable) static_assert(std::is_trivially_relocatable_v); #endif // __cpp_lib_trivially_relocatable @@ -176,6 +184,7 @@ TEST(IPV_TEST_NAME, TrivialTraits) static_assert(!std::is_copy_assignable_v); static_assert(std::is_nothrow_move_assignable_v); static_assert(std::is_nothrow_destructible_v); + static_assert(std::is_nothrow_swappable_v); #if defined(__cpp_lib_trivially_relocatable) static_assert(std::is_trivially_relocatable_v); #endif // __cpp_lib_trivially_relocatable diff --git a/test/aa_inplace_vector_stdallocator_test.cpp b/test/aa_inplace_vector_stdallocator_test.cpp index d714e10..09b2688 100644 --- a/test/aa_inplace_vector_stdallocator_test.cpp +++ b/test/aa_inplace_vector_stdallocator_test.cpp @@ -19,6 +19,7 @@ TEST(IPV_TEST_NAME, TrivialTraits) static_assert(std::is_nothrow_copy_assignable_v); static_assert(std::is_nothrow_move_assignable_v); static_assert(std::is_nothrow_destructible_v); + static_assert(std::is_nothrow_swappable_v); #if defined(__cpp_lib_trivially_relocatable) static_assert(std::is_trivially_relocatable_v); #endif // __cpp_lib_trivially_relocatable @@ -36,6 +37,7 @@ TEST(IPV_TEST_NAME, TrivialTraits) static_assert(!std::is_nothrow_copy_assignable_v); static_assert(std::is_nothrow_move_assignable_v); static_assert(std::is_nothrow_destructible_v); + static_assert(std::is_nothrow_swappable_v); #if defined(__cpp_lib_trivially_relocatable) static_assert(std::is_trivially_relocatable_v); #endif // __cpp_lib_trivially_relocatable @@ -54,6 +56,7 @@ TEST(IPV_TEST_NAME, TrivialTraits) static_assert(!std::is_nothrow_copy_assignable_v); static_assert(std::is_nothrow_move_assignable_v == !msvc); static_assert(std::is_nothrow_destructible_v); + static_assert(std::is_nothrow_swappable_v); #if defined(__cpp_lib_trivially_relocatable) static_assert(std::is_trivially_relocatable_v == msvc); #endif // __cpp_lib_trivially_relocatable @@ -71,6 +74,7 @@ TEST(IPV_TEST_NAME, TrivialTraits) static_assert(!std::is_copy_assignable_v); static_assert(std::is_nothrow_move_assignable_v); static_assert(std::is_nothrow_destructible_v); + static_assert(std::is_nothrow_swappable_v); #if defined(__cpp_lib_trivially_relocatable) static_assert(std::is_trivially_relocatable_v); #endif // __cpp_lib_trivially_relocatable @@ -88,6 +92,7 @@ TEST(IPV_TEST_NAME, TrivialTraits) static_assert(!std::is_copy_assignable_v); static_assert(std::is_nothrow_move_assignable_v); static_assert(std::is_nothrow_destructible_v); + static_assert(std::is_nothrow_swappable_v); #if defined(__cpp_lib_trivially_relocatable) static_assert(!std::is_trivially_relocatable_v); #endif // __cpp_lib_trivially_relocatable @@ -105,6 +110,7 @@ TEST(IPV_TEST_NAME, TrivialTraits) static_assert(std::is_nothrow_copy_assignable_v); static_assert(std::is_nothrow_move_assignable_v); static_assert(std::is_nothrow_destructible_v); + static_assert(std::is_nothrow_swappable_v); #if defined(__cpp_lib_trivially_relocatable) static_assert(std::is_trivially_relocatable_v); #endif // __cpp_lib_trivially_relocatable @@ -122,6 +128,7 @@ TEST(IPV_TEST_NAME, TrivialTraits) static_assert(std::is_nothrow_copy_assignable_v); static_assert(std::is_nothrow_move_assignable_v); static_assert(std::is_nothrow_destructible_v); + static_assert(std::is_nothrow_swappable_v); #if defined(__cpp_lib_trivially_relocatable) static_assert(std::is_trivially_relocatable_v); #endif // __cpp_lib_trivially_relocatable @@ -139,6 +146,7 @@ TEST(IPV_TEST_NAME, TrivialTraits) static_assert(std::is_nothrow_copy_assignable_v); static_assert(std::is_nothrow_move_assignable_v); static_assert(std::is_nothrow_destructible_v); + static_assert(std::is_nothrow_swappable_v); #if defined(__cpp_lib_trivially_relocatable) static_assert(std::is_trivially_relocatable_v); #endif // __cpp_lib_trivially_relocatable @@ -156,6 +164,7 @@ TEST(IPV_TEST_NAME, TrivialTraits) static_assert(!std::is_copy_assignable_v); static_assert(std::is_nothrow_move_assignable_v); static_assert(std::is_nothrow_destructible_v); + static_assert(std::is_nothrow_swappable_v); #if defined(__cpp_lib_trivially_relocatable) static_assert(std::is_trivially_relocatable_v); #endif // __cpp_lib_trivially_relocatable diff --git a/test/inplace_vector_common_tests.cpp b/test/inplace_vector_common_tests.cpp index e448fe4..1d91d82 100644 --- a/test/inplace_vector_common_tests.cpp +++ b/test/inplace_vector_common_tests.cpp @@ -450,16 +450,9 @@ TEST(IPV_TEST_NAME, Noexceptness) static_assert(!noexcept(v.erase(v.begin(), v.end()))); } -TEST(IPV_TEST_NAME, NoexceptnessOfSwap) +TEST(IPV_TEST_NAME, SwapWhenElementSwappingThrows) { using std::swap; - { - std::string lvalue; - sg14::inplace_vector v; - static_assert(noexcept(swap(lvalue, lvalue))); - static_assert(noexcept(v.swap(v))); - static_assert(noexcept(swap(v, v))); - } { struct ThrowingSwappable { explicit ThrowingSwappable() { } diff --git a/test/inplace_vector_test.cpp b/test/inplace_vector_test.cpp index 887c6d2..923ada1 100644 --- a/test/inplace_vector_test.cpp +++ b/test/inplace_vector_test.cpp @@ -19,6 +19,7 @@ TEST(IPV_TEST_NAME, TrivialTraits) static_assert(std::is_nothrow_copy_assignable_v); static_assert(std::is_nothrow_move_assignable_v); static_assert(std::is_nothrow_destructible_v); + static_assert(std::is_nothrow_swappable_v); #if defined(__cpp_lib_trivially_relocatable) static_assert(std::is_trivially_relocatable_v); #endif // __cpp_lib_trivially_relocatable @@ -36,6 +37,7 @@ TEST(IPV_TEST_NAME, TrivialTraits) static_assert(!std::is_nothrow_copy_assignable_v); static_assert(std::is_nothrow_move_assignable_v); static_assert(std::is_nothrow_destructible_v); + static_assert(std::is_nothrow_swappable_v); #if defined(__cpp_lib_trivially_relocatable) static_assert(std::is_trivially_relocatable_v); #endif // __cpp_lib_trivially_relocatable @@ -54,6 +56,7 @@ TEST(IPV_TEST_NAME, TrivialTraits) static_assert(!std::is_nothrow_copy_assignable_v); static_assert(std::is_nothrow_move_assignable_v == !msvc); static_assert(std::is_nothrow_destructible_v); + static_assert(std::is_nothrow_swappable_v); #if defined(__cpp_lib_trivially_relocatable) static_assert(std::is_trivially_relocatable_v == msvc); #endif // __cpp_lib_trivially_relocatable @@ -71,6 +74,7 @@ TEST(IPV_TEST_NAME, TrivialTraits) static_assert(!std::is_copy_assignable_v); static_assert(std::is_nothrow_move_assignable_v); static_assert(std::is_nothrow_destructible_v); + static_assert(std::is_nothrow_swappable_v); #if defined(__cpp_lib_trivially_relocatable) static_assert(std::is_trivially_relocatable_v); #endif // __cpp_lib_trivially_relocatable @@ -88,6 +92,7 @@ TEST(IPV_TEST_NAME, TrivialTraits) static_assert(!std::is_copy_assignable_v); static_assert(std::is_nothrow_move_assignable_v); static_assert(std::is_nothrow_destructible_v); + static_assert(std::is_nothrow_swappable_v); #if defined(__cpp_lib_trivially_relocatable) static_assert(!std::is_trivially_relocatable_v); #endif // __cpp_lib_trivially_relocatable @@ -105,6 +110,7 @@ TEST(IPV_TEST_NAME, TrivialTraits) static_assert(std::is_nothrow_copy_assignable_v); static_assert(std::is_nothrow_move_assignable_v); static_assert(std::is_nothrow_destructible_v); + static_assert(std::is_nothrow_swappable_v); #if defined(__cpp_lib_trivially_relocatable) static_assert(std::is_trivially_relocatable_v); #endif // __cpp_lib_trivially_relocatable @@ -122,6 +128,7 @@ TEST(IPV_TEST_NAME, TrivialTraits) static_assert(std::is_nothrow_copy_assignable_v); static_assert(std::is_nothrow_move_assignable_v); static_assert(std::is_nothrow_destructible_v); + static_assert(std::is_nothrow_swappable_v); #if defined(__cpp_lib_trivially_relocatable) static_assert(std::is_trivially_relocatable_v); #endif // __cpp_lib_trivially_relocatable @@ -139,6 +146,7 @@ TEST(IPV_TEST_NAME, TrivialTraits) static_assert(std::is_nothrow_copy_assignable_v); static_assert(std::is_nothrow_move_assignable_v); static_assert(std::is_nothrow_destructible_v); + static_assert(std::is_nothrow_swappable_v); #if defined(__cpp_lib_trivially_relocatable) static_assert(std::is_trivially_relocatable_v); #endif // __cpp_lib_trivially_relocatable @@ -156,6 +164,7 @@ TEST(IPV_TEST_NAME, TrivialTraits) static_assert(!std::is_copy_assignable_v); static_assert(std::is_nothrow_move_assignable_v); static_assert(std::is_nothrow_destructible_v); + static_assert(std::is_nothrow_swappable_v); #if defined(__cpp_lib_trivially_relocatable) static_assert(std::is_trivially_relocatable_v); #endif // __cpp_lib_trivially_relocatable