15a83710eSEric Fiselier //===----------------------------------------------------------------------===// 25a83710eSEric Fiselier // 357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65a83710eSEric Fiselier // 75a83710eSEric Fiselier //===----------------------------------------------------------------------===// 85a83710eSEric Fiselier 931cbe0f2SLouis Dionne // UNSUPPORTED: c++03 101f4231f8SEric Fiselier 11*425620ccSNikolas Klauser // XFAIL: LIBCXX-AIX-FIXME 12*425620ccSNikolas Klauser 135a83710eSEric Fiselier // <string> 145a83710eSEric Fiselier 15*425620ccSNikolas Klauser // basic_string(basic_string&& str, const Allocator& alloc); // constexpr since C++20 165a83710eSEric Fiselier 175a83710eSEric Fiselier #include <string> 185a83710eSEric Fiselier #include <cassert> 195a83710eSEric Fiselier 20cbf166a2SMarshall Clow #include "test_macros.h" 215a83710eSEric Fiselier #include "test_allocator.h" 225a83710eSEric Fiselier #include "min_allocator.h" 235a83710eSEric Fiselier 245a83710eSEric Fiselier template <class S> 25e85018b7SNikolas Klauser TEST_CONSTEXPR_CXX20 void 265a83710eSEric Fiselier test(S s0, const typename S::allocator_type& a) 275a83710eSEric Fiselier { 285a83710eSEric Fiselier S s1 = s0; 295a83710eSEric Fiselier S s2(std::move(s0), a); 301f4231f8SEric Fiselier LIBCPP_ASSERT(s2.__invariants()); 311f4231f8SEric Fiselier LIBCPP_ASSERT(s0.__invariants()); 325a83710eSEric Fiselier assert(s2 == s1); 335a83710eSEric Fiselier assert(s2.capacity() >= s2.size()); 345a83710eSEric Fiselier assert(s2.get_allocator() == a); 355a83710eSEric Fiselier } 365a83710eSEric Fiselier 37*425620ccSNikolas Klauser TEST_CONSTEXPR_CXX20 bool test() { 389a140a15SNikolas Klauser test_allocator_statistics alloc_stats; 395a83710eSEric Fiselier { 405a83710eSEric Fiselier typedef test_allocator<char> A; 415a83710eSEric Fiselier typedef std::basic_string<char, std::char_traits<char>, A> S; 42cbf166a2SMarshall Clow #if TEST_STD_VER > 14 43cbf166a2SMarshall Clow static_assert((noexcept(S{})), "" ); 44cbf166a2SMarshall Clow #elif TEST_STD_VER >= 11 45cbf166a2SMarshall Clow static_assert((noexcept(S()) == std::is_nothrow_move_constructible<A>::value), "" ); 46cbf166a2SMarshall Clow #endif 479a140a15SNikolas Klauser test(S(), A(3, &alloc_stats)); 489a140a15SNikolas Klauser test(S("1"), A(5, &alloc_stats)); 499a140a15SNikolas Klauser test(S("1234567890123456789012345678901234567890123456789012345678901234567890"), A(7, &alloc_stats)); 505a83710eSEric Fiselier } 515a83710eSEric Fiselier 529a140a15SNikolas Klauser int alloc_count = alloc_stats.alloc_count; 535a83710eSEric Fiselier { 545a83710eSEric Fiselier typedef test_allocator<char> A; 555a83710eSEric Fiselier typedef std::basic_string<char, std::char_traits<char>, A> S; 56cbf166a2SMarshall Clow #if TEST_STD_VER > 14 57cbf166a2SMarshall Clow static_assert((noexcept(S{})), "" ); 58cbf166a2SMarshall Clow #elif TEST_STD_VER >= 11 59cbf166a2SMarshall Clow static_assert((noexcept(S()) == std::is_nothrow_move_constructible<A>::value), "" ); 60cbf166a2SMarshall Clow #endif 619a140a15SNikolas Klauser S s1 ( "Twas brillig, and the slivy toves did gyre and gymbal in the wabe", A(&alloc_stats)); 629a140a15SNikolas Klauser S s2 (std::move(s1), A(1, &alloc_stats)); 635a83710eSEric Fiselier } 649a140a15SNikolas Klauser assert ( alloc_stats.alloc_count == alloc_count ); 655a83710eSEric Fiselier { 665a83710eSEric Fiselier typedef min_allocator<char> A; 675a83710eSEric Fiselier typedef std::basic_string<char, std::char_traits<char>, A> S; 68cbf166a2SMarshall Clow #if TEST_STD_VER > 14 69cbf166a2SMarshall Clow static_assert((noexcept(S{})), "" ); 70cbf166a2SMarshall Clow #elif TEST_STD_VER >= 11 71cbf166a2SMarshall Clow static_assert((noexcept(S()) == std::is_nothrow_move_constructible<A>::value), "" ); 72cbf166a2SMarshall Clow #endif 735a83710eSEric Fiselier test(S(), A()); 745a83710eSEric Fiselier test(S("1"), A()); 755a83710eSEric Fiselier test(S("1234567890123456789012345678901234567890123456789012345678901234567890"), A()); 765a83710eSEric Fiselier } 772df59c50SJF Bastien 78e85018b7SNikolas Klauser return true; 79e85018b7SNikolas Klauser } 80e85018b7SNikolas Klauser 81e85018b7SNikolas Klauser int main(int, char**) 82e85018b7SNikolas Klauser { 83e85018b7SNikolas Klauser test(); 84e85018b7SNikolas Klauser #if TEST_STD_VER > 17 85*425620ccSNikolas Klauser static_assert(test()); 86e85018b7SNikolas Klauser #endif 87e85018b7SNikolas Klauser 882df59c50SJF Bastien return 0; 895a83710eSEric Fiselier } 90