brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.3 KiB · edd3913 Raw
129 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// <string>10 11// basic_string<charT,traits,Allocator>&12//   assign(const basic_string<charT,traits>& str); // constexpr since C++2013 14#include <string>15#include <cassert>16 17#include "test_macros.h"18#include "nasty_string.h"19#include "min_allocator.h"20#include "test_allocator.h"21#include "asan_testing.h"22 23template <class S>24TEST_CONSTEXPR_CXX20 void test(S dest, S src) {25  dest.assign(src);26  LIBCPP_ASSERT(dest.__invariants());27  assert(dest == src);28  LIBCPP_ASSERT(is_string_asan_correct(src));29  LIBCPP_ASSERT(is_string_asan_correct(dest));30}31 32template <class S>33TEST_CONSTEXPR_CXX20 void testAlloc(S dest, S src, const typename S::allocator_type& a) {34  dest.assign(src);35  LIBCPP_ASSERT(dest.__invariants());36  assert(dest == src);37  assert(dest.get_allocator() == a);38}39 40template <class S>41TEST_CONSTEXPR_CXX20 void test_assign() {42  using CharT = typename S::value_type;43 44  test(S(), S());45  test(S(), S(CONVERT_TO_CSTRING(CharT, "12345")));46  test(S(), S(CONVERT_TO_CSTRING(CharT, "1234567890")));47  test(S(), S(CONVERT_TO_CSTRING(CharT, "12345678901234567890")));48 49  test(S(CONVERT_TO_CSTRING(CharT, "12345")), S());50  test(S(CONVERT_TO_CSTRING(CharT, "12345")), S(CONVERT_TO_CSTRING(CharT, "12345")));51  test(S(CONVERT_TO_CSTRING(CharT, "12345")), S(CONVERT_TO_CSTRING(CharT, "1234567890")));52  test(S(CONVERT_TO_CSTRING(CharT, "12345")), S(CONVERT_TO_CSTRING(CharT, "12345678901234567890")));53 54  test(S(CONVERT_TO_CSTRING(CharT, "1234567890")), S());55  test(S(CONVERT_TO_CSTRING(CharT, "1234567890")), S(CONVERT_TO_CSTRING(CharT, "12345")));56  test(S(CONVERT_TO_CSTRING(CharT, "1234567890")), S(CONVERT_TO_CSTRING(CharT, "1234567890")));57  test(S(CONVERT_TO_CSTRING(CharT, "1234567890")), S(CONVERT_TO_CSTRING(CharT, "12345678901234567890")));58 59  test(S(CONVERT_TO_CSTRING(CharT, "12345678901234567890")), S());60  test(S(CONVERT_TO_CSTRING(CharT, "12345678901234567890")), S(CONVERT_TO_CSTRING(CharT, "12345")));61  test(S(CONVERT_TO_CSTRING(CharT, "12345678901234567890")), S(CONVERT_TO_CSTRING(CharT, "1234567890")));62  test(S(CONVERT_TO_CSTRING(CharT, "12345678901234567890")), S(CONVERT_TO_CSTRING(CharT, "12345678901234567890")));63}64 65TEST_CONSTEXPR_CXX20 bool test() {66  test_assign<std::string>();67#ifndef TEST_HAS_NO_WIDE_CHARACTERS68  test_assign<std::wstring>();69#endif70#if TEST_STD_VER >= 2071  test_assign<std::u8string>();72#endif73#if TEST_STD_VER >= 1174  test_assign<std::u16string>();75  test_assign<std::u32string>();76#endif77#if TEST_STD_VER >= 2078  test_assign<nasty_string>();79#endif80 81  {82    typedef std::string S;83    testAlloc(S(), S(), std::allocator<char>());84    testAlloc(S(), S("12345"), std::allocator<char>());85    testAlloc(S(), S("1234567890"), std::allocator<char>());86    testAlloc(S(), S("12345678901234567890"), std::allocator<char>());87  }88 89  {                                  //  LWG#5579 make sure assign takes the allocators where appropriate90    typedef other_allocator<char> A; // has POCCA --> true91    typedef std::basic_string<char, std::char_traits<char>, A> S;92    testAlloc(S(A(5)), S(A(3)), A(3));93    testAlloc(S(A(5)), S("1"), A());94    testAlloc(S(A(5)), S("1", A(7)), A(7));95    testAlloc(S(A(5)), S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), A(7));96    testAlloc(S("12345678901234567890", A(5)),97              S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)),98              A(7));99  }100 101#if TEST_STD_VER >= 11102  {103    typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;104    test_assign<S>();105    testAlloc(S(), S(), min_allocator<char>());106    testAlloc(S(), S("12345"), min_allocator<char>());107    testAlloc(S(), S("1234567890"), min_allocator<char>());108    testAlloc(S(), S("12345678901234567890"), min_allocator<char>());109  }110#endif111#if TEST_STD_VER > 14112  {113    typedef std::string S;114    static_assert(noexcept(S().assign(S())), ""); // LWG#2063115  }116#endif117 118  return true;119}120 121int main(int, char**) {122  test();123#if TEST_STD_VER > 17124  static_assert(test());125#endif126 127  return 0;128}129