brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.1 KiB · 93a8e59 Raw
102 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++0310 11// <string>12 13// basic_string(basic_string&& str, const Allocator& alloc); // constexpr since C++2014 15#include <string>16#include <cassert>17 18#include "test_macros.h"19#include "test_allocator.h"20#include "min_allocator.h"21#include "asan_testing.h"22#include "operator_hijacker.h"23 24template <class S>25TEST_CONSTEXPR_CXX20 void test(S s0, const typename S::allocator_type& a) {26  S s1 = s0;27  S s2(std::move(s0), a);28  LIBCPP_ASSERT(s2.__invariants());29  LIBCPP_ASSERT(s0.__invariants());30  assert(s2 == s1);31  assert(s2.capacity() >= s2.size());32  assert(s2.get_allocator() == a);33  LIBCPP_ASSERT(is_string_asan_correct(s0));34  LIBCPP_ASSERT(is_string_asan_correct(s1));35  LIBCPP_ASSERT(is_string_asan_correct(s2));36}37 38TEST_CONSTEXPR_CXX20 bool test() {39  test_allocator_statistics alloc_stats;40  {41    typedef test_allocator<char> A;42    typedef std::basic_string<char, std::char_traits<char>, A> S;43#if TEST_STD_VER > 1444    static_assert((noexcept(S{})), "");45#elif TEST_STD_VER >= 1146    static_assert((noexcept(S()) == std::is_nothrow_move_constructible<A>::value), "");47#endif48    test(S(), A(3, &alloc_stats));49    test(S("1"), A(5, &alloc_stats));50    test(S("1234567890123456789012345678901234567890123456789012345678901234567890"), A(7, &alloc_stats));51  }52 53  int alloc_count = alloc_stats.alloc_count;54  {55    typedef test_allocator<char> A;56    typedef std::basic_string<char, std::char_traits<char>, A> S;57#if TEST_STD_VER > 1458    static_assert((noexcept(S{})), "");59#elif TEST_STD_VER >= 1160    static_assert((noexcept(S()) == std::is_nothrow_move_constructible<A>::value), "");61#endif62    S s1("Twas brillig, and the slivy toves did gyre and gymbal in the wabe", A(&alloc_stats));63    S s2(std::move(s1), A(1, &alloc_stats));64  }65  assert(alloc_stats.alloc_count == alloc_count);66  {67    typedef min_allocator<char> A;68    typedef std::basic_string<char, std::char_traits<char>, A> S;69#if TEST_STD_VER > 1470    static_assert((noexcept(S{})), "");71#elif TEST_STD_VER >= 1172    static_assert((noexcept(S()) == std::is_nothrow_move_constructible<A>::value), "");73#endif74    test(S(), A());75    test(S("1"), A());76    test(S("1234567890123456789012345678901234567890123456789012345678901234567890"), A());77  }78  {79    typedef operator_hijacker_allocator<char> A;80    typedef std::basic_string<char, std::char_traits<char>, A> S;81#if TEST_STD_VER > 1482    static_assert((noexcept(S{})), "");83#elif TEST_STD_VER >= 1184    static_assert((noexcept(S()) == std::is_nothrow_move_constructible<A>::value), "");85#endif86    test(S(), A());87    test(S("1"), A());88    test(S("1234567890123456789012345678901234567890123456789012345678901234567890"), A());89  }90 91  return true;92}93 94int main(int, char**) {95  test();96#if TEST_STD_VER > 1797  static_assert(test());98#endif99 100  return 0;101}102