//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // basic_string& // assign(const basic_string& str); // constexpr since C++20 #include #include #include "test_macros.h" #include "nasty_string.h" #include "min_allocator.h" #include "test_allocator.h" template TEST_CONSTEXPR_CXX20 void test(S dest, S src) { dest.assign(src); LIBCPP_ASSERT(dest.__invariants()); assert(dest == src); } template TEST_CONSTEXPR_CXX20 void testAlloc(S dest, S src, const typename S::allocator_type& a) { dest.assign(src); LIBCPP_ASSERT(dest.__invariants()); assert(dest == src); assert(dest.get_allocator() == a); } template TEST_CONSTEXPR_CXX20 void test_assign() { using CharT = typename S::value_type; test(S(), S()); test(S(), S(CONVERT_TO_CSTRING(CharT, "12345"))); test(S(), S(CONVERT_TO_CSTRING(CharT, "1234567890"))); test(S(), S(CONVERT_TO_CSTRING(CharT, "12345678901234567890"))); test(S(CONVERT_TO_CSTRING(CharT, "12345")), S()); test(S(CONVERT_TO_CSTRING(CharT, "12345")), S(CONVERT_TO_CSTRING(CharT, "12345"))); test(S(CONVERT_TO_CSTRING(CharT, "12345")), S(CONVERT_TO_CSTRING(CharT, "1234567890"))); test(S(CONVERT_TO_CSTRING(CharT, "12345")), S(CONVERT_TO_CSTRING(CharT, "12345678901234567890"))); test(S(CONVERT_TO_CSTRING(CharT, "1234567890")), S()); test(S(CONVERT_TO_CSTRING(CharT, "1234567890")), S(CONVERT_TO_CSTRING(CharT, "12345"))); test(S(CONVERT_TO_CSTRING(CharT, "1234567890")), S(CONVERT_TO_CSTRING(CharT, "1234567890"))); test(S(CONVERT_TO_CSTRING(CharT, "1234567890")), S(CONVERT_TO_CSTRING(CharT, "12345678901234567890"))); test(S(CONVERT_TO_CSTRING(CharT, "12345678901234567890")), S()); test(S(CONVERT_TO_CSTRING(CharT, "12345678901234567890")), S(CONVERT_TO_CSTRING(CharT, "12345"))); test(S(CONVERT_TO_CSTRING(CharT, "12345678901234567890")), S(CONVERT_TO_CSTRING(CharT, "1234567890"))); test(S(CONVERT_TO_CSTRING(CharT, "12345678901234567890")), S(CONVERT_TO_CSTRING(CharT, "12345678901234567890"))); } TEST_CONSTEXPR_CXX20 bool test() { test_assign(); #ifndef TEST_HAS_NO_WIDE_CHARACTERS test_assign(); #endif #if TEST_STD_VER >= 20 test_assign(); #endif #if TEST_STD_VER >= 11 test_assign(); test_assign(); #endif #ifndef TEST_HAS_NO_NASTY_STRING test_assign(); #endif { typedef std::string S; testAlloc(S(), S(), std::allocator()); testAlloc(S(), S("12345"), std::allocator()); testAlloc(S(), S("1234567890"), std::allocator()); testAlloc(S(), S("12345678901234567890"), std::allocator()); } { // LWG#5579 make sure assign takes the allocators where appropriate typedef other_allocator A; // has POCCA --> true typedef std::basic_string, A> S; testAlloc(S(A(5)), S(A(3)), A(3)); testAlloc(S(A(5)), S("1"), A()); testAlloc(S(A(5)), S("1", A(7)), A(7)); testAlloc(S(A(5)), S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), A(7)); } #if TEST_STD_VER >= 11 { typedef std::basic_string, min_allocator> S; test_assign(); testAlloc(S(), S(), min_allocator()); testAlloc(S(), S("12345"), min_allocator()); testAlloc(S(), S("1234567890"), min_allocator()); testAlloc(S(), S("12345678901234567890"), min_allocator()); } #endif #if TEST_STD_VER > 14 { typedef std::string S; static_assert(noexcept(S().assign(S())), ""); // LWG#2063 } #endif return true; } int main(int, char**) { test(); #if TEST_STD_VER > 17 static_assert(test()); #endif return 0; }