15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
35a83710eSEric Fiselier //                     The LLVM Compiler Infrastructure
45a83710eSEric Fiselier //
55a83710eSEric Fiselier // This file is dual licensed under the MIT and the University of Illinois Open
65a83710eSEric Fiselier // Source Licenses. See LICENSE.TXT for details.
75a83710eSEric Fiselier //
85a83710eSEric Fiselier //===----------------------------------------------------------------------===//
95a83710eSEric Fiselier 
10*1f4231f8SEric Fiselier // UNSUPPORTED: c++98, c++03
11*1f4231f8SEric Fiselier 
125a83710eSEric Fiselier // <string>
135a83710eSEric Fiselier 
145a83710eSEric Fiselier // basic_string(basic_string&& str, const Allocator& alloc);
155a83710eSEric Fiselier 
165a83710eSEric Fiselier #include <string>
175a83710eSEric Fiselier #include <cassert>
185a83710eSEric Fiselier 
19cbf166a2SMarshall Clow #include "test_macros.h"
205a83710eSEric Fiselier #include "test_allocator.h"
215a83710eSEric Fiselier #include "min_allocator.h"
225a83710eSEric Fiselier 
235a83710eSEric Fiselier 
245a83710eSEric Fiselier template <class S>
255a83710eSEric Fiselier 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);
30*1f4231f8SEric Fiselier     LIBCPP_ASSERT(s2.__invariants());
31*1f4231f8SEric 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 
375a83710eSEric Fiselier 
385a83710eSEric Fiselier int main()
395a83710eSEric Fiselier {
405a83710eSEric Fiselier     {
415a83710eSEric Fiselier     typedef test_allocator<char> A;
425a83710eSEric Fiselier     typedef std::basic_string<char, std::char_traits<char>, A> S;
43cbf166a2SMarshall Clow #if TEST_STD_VER > 14
44cbf166a2SMarshall Clow 	static_assert((noexcept(S{})), "" );
45cbf166a2SMarshall Clow #elif TEST_STD_VER >= 11
46cbf166a2SMarshall Clow 	static_assert((noexcept(S()) == std::is_nothrow_move_constructible<A>::value), "" );
47cbf166a2SMarshall Clow #endif
485a83710eSEric Fiselier     test(S(), A(3));
495a83710eSEric Fiselier     test(S("1"), A(5));
505a83710eSEric Fiselier     test(S("1234567890123456789012345678901234567890123456789012345678901234567890"), A(7));
515a83710eSEric Fiselier     }
525a83710eSEric Fiselier 
535a83710eSEric Fiselier     int alloc_count = test_alloc_base::alloc_count;
545a83710eSEric Fiselier     {
555a83710eSEric Fiselier     typedef test_allocator<char> A;
565a83710eSEric Fiselier     typedef std::basic_string<char, std::char_traits<char>, A> S;
57cbf166a2SMarshall Clow #if TEST_STD_VER > 14
58cbf166a2SMarshall Clow 	static_assert((noexcept(S{})), "" );
59cbf166a2SMarshall Clow #elif TEST_STD_VER >= 11
60cbf166a2SMarshall Clow 	static_assert((noexcept(S()) == std::is_nothrow_move_constructible<A>::value), "" );
61cbf166a2SMarshall Clow #endif
625a83710eSEric Fiselier     S s1 ( "Twas brillig, and the slivy toves did gyre and gymbal in the wabe" );
635a83710eSEric Fiselier     S s2 (std::move(s1), A(1));
645a83710eSEric Fiselier     }
655a83710eSEric Fiselier     assert ( test_alloc_base::alloc_count == alloc_count );
665a83710eSEric Fiselier     {
675a83710eSEric Fiselier     typedef min_allocator<char> A;
685a83710eSEric Fiselier     typedef std::basic_string<char, std::char_traits<char>, A> S;
69cbf166a2SMarshall Clow #if TEST_STD_VER > 14
70cbf166a2SMarshall Clow 	static_assert((noexcept(S{})), "" );
71cbf166a2SMarshall Clow #elif TEST_STD_VER >= 11
72cbf166a2SMarshall Clow 	static_assert((noexcept(S()) == std::is_nothrow_move_constructible<A>::value), "" );
73cbf166a2SMarshall Clow #endif
745a83710eSEric Fiselier     test(S(), A());
755a83710eSEric Fiselier     test(S("1"), A());
765a83710eSEric Fiselier     test(S("1234567890123456789012345678901234567890123456789012345678901234567890"), A());
775a83710eSEric Fiselier     }
785a83710eSEric Fiselier }
79