//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // template // basic_string // operator+(const basic_string& lhs, // const basic_string& rhs); // constexpr since C++20 // template // basic_string&& // operator+(const basic_string&& lhs, // const basic_string& rhs); // constexpr since C++20 // template // basic_string&& // operator+(const basic_string& lhs, // const basic_string&& rhs); // constexpr since C++20 // template // basic_string&& // operator+(const basic_string&& lhs, // const basic_string&& rhs); // constexpr since C++20 #include #include #include #include "asan_testing.h" #include "min_allocator.h" #include "test_macros.h" template TEST_CONSTEXPR_CXX20 void test_string() { const char* test_data[2][4] = { {"", "abcde", "abcdefghij", "abcdefghijklmnopqrst"}, {"", "12345", "1234567890", "12345678901234567890"}}; const char* results[4][4] = { {"", "12345", "1234567890", "12345678901234567890"}, {"abcde", "abcde12345", "abcde1234567890", "abcde12345678901234567890"}, {"abcdefghij", "abcdefghij12345", "abcdefghij1234567890", "abcdefghij12345678901234567890"}, {"abcdefghijklmnopqrst", "abcdefghijklmnopqrst12345", "abcdefghijklmnopqrst1234567890", "abcdefghijklmnopqrst12345678901234567890"}}; for (size_t i = 0; i != 4; ++i) { for (size_t k = 0; k != 4; ++k) { { // operator+(const string&, const string&); const S lhs(test_data[0][i]); const S rhs(test_data[1][k]); assert(lhs + rhs == results[i][k]); LIBCPP_ASSERT(is_string_asan_correct(lhs + rhs)); } #if TEST_STD_VER >= 11 { // operator+(string&&, const string&); S lhs(test_data[0][i]); const S rhs(test_data[1][k]); assert(std::move(lhs) + rhs == results[i][k]); } { // operator+(const string&, string&&); const S lhs(test_data[0][i]); S rhs(test_data[1][k]); assert(lhs + std::move(rhs) == results[i][k]); } { // operator+(string&&, string&&); S lhs(test_data[0][i]); S rhs(test_data[1][k]); assert(std::move(lhs) + std::move(rhs) == results[i][k]); } #endif } } } TEST_CONSTEXPR_CXX20 bool test() { test_string(); #if TEST_STD_VER >= 11 test_string, min_allocator>>(); test_string, safe_allocator>>(); #endif { // check that growing to max_size() works using string_type = std::basic_string, tiny_size_allocator<29, char> >; string_type lhs; lhs.resize(lhs.max_size() - 1); string_type rhs = "a"; string_type result = lhs + rhs; assert(result.size() == result.max_size()); assert(result.back() == 'a'); assert(result.capacity() <= result.get_allocator().max_size()); } return true; } int main(int, char**) { test(); #if TEST_STD_VER >= 20 static_assert(test()); #endif return 0; }