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 
105a83710eSEric Fiselier // <string>
115a83710eSEric Fiselier 
125a83710eSEric Fiselier // basic_string(basic_string&& str, const Allocator& alloc);
135a83710eSEric Fiselier 
145a83710eSEric Fiselier #include <string>
155a83710eSEric Fiselier #include <cassert>
165a83710eSEric Fiselier 
175a83710eSEric Fiselier #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
185a83710eSEric Fiselier 
19*cbf166a2SMarshall 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);
305a83710eSEric Fiselier     assert(s2.__invariants());
315a83710eSEric Fiselier     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 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
38*cbf166a2SMarshall Clow // #if _LIBCPP_STD_VER <= 14
39*cbf166a2SMarshall Clow //         _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
40*cbf166a2SMarshall Clow // #else
41*cbf166a2SMarshall Clow //         _NOEXCEPT;
42*cbf166a2SMarshall Clow // #endif
435a83710eSEric Fiselier 
445a83710eSEric Fiselier int main()
455a83710eSEric Fiselier {
465a83710eSEric Fiselier #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
475a83710eSEric Fiselier     {
485a83710eSEric Fiselier     typedef test_allocator<char> A;
495a83710eSEric Fiselier     typedef std::basic_string<char, std::char_traits<char>, A> S;
50*cbf166a2SMarshall Clow #if TEST_STD_VER > 14
51*cbf166a2SMarshall Clow 	static_assert((noexcept(S{})), "" );
52*cbf166a2SMarshall Clow #elif TEST_STD_VER >= 11
53*cbf166a2SMarshall Clow 	static_assert((noexcept(S()) == std::is_nothrow_move_constructible<A>::value), "" );
54*cbf166a2SMarshall Clow #endif
555a83710eSEric Fiselier     test(S(), A(3));
565a83710eSEric Fiselier     test(S("1"), A(5));
575a83710eSEric Fiselier     test(S("1234567890123456789012345678901234567890123456789012345678901234567890"), A(7));
585a83710eSEric Fiselier     }
595a83710eSEric Fiselier 
605a83710eSEric Fiselier     int alloc_count = test_alloc_base::alloc_count;
615a83710eSEric Fiselier     {
625a83710eSEric Fiselier     typedef test_allocator<char> A;
635a83710eSEric Fiselier     typedef std::basic_string<char, std::char_traits<char>, A> S;
64*cbf166a2SMarshall Clow #if TEST_STD_VER > 14
65*cbf166a2SMarshall Clow 	static_assert((noexcept(S{})), "" );
66*cbf166a2SMarshall Clow #elif TEST_STD_VER >= 11
67*cbf166a2SMarshall Clow 	static_assert((noexcept(S()) == std::is_nothrow_move_constructible<A>::value), "" );
68*cbf166a2SMarshall Clow #endif
695a83710eSEric Fiselier     S s1 ( "Twas brillig, and the slivy toves did gyre and gymbal in the wabe" );
705a83710eSEric Fiselier     S s2 (std::move(s1), A(1));
715a83710eSEric Fiselier     }
725a83710eSEric Fiselier     assert ( test_alloc_base::alloc_count == alloc_count );
735a83710eSEric Fiselier 
74*cbf166a2SMarshall Clow #if TEST_STD_VER >= 11
755a83710eSEric Fiselier     {
765a83710eSEric Fiselier     typedef min_allocator<char> A;
775a83710eSEric Fiselier     typedef std::basic_string<char, std::char_traits<char>, A> S;
78*cbf166a2SMarshall Clow #if TEST_STD_VER > 14
79*cbf166a2SMarshall Clow 	static_assert((noexcept(S{})), "" );
80*cbf166a2SMarshall Clow #elif TEST_STD_VER >= 11
81*cbf166a2SMarshall Clow 	static_assert((noexcept(S()) == std::is_nothrow_move_constructible<A>::value), "" );
82*cbf166a2SMarshall Clow #endif
835a83710eSEric Fiselier     test(S(), A());
845a83710eSEric Fiselier     test(S("1"), A());
855a83710eSEric Fiselier     test(S("1234567890123456789012345678901234567890123456789012345678901234567890"), A());
865a83710eSEric Fiselier     }
875a83710eSEric Fiselier #endif
885a83710eSEric Fiselier #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
895a83710eSEric Fiselier }
90