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-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 // XFAIL: LIBCXX-AIX-FIXME 10 11 // <string> 12 13 // template<class charT, class traits, class Allocator> 14 // basic_string<charT,traits,Allocator> 15 // operator+(const charT* lhs, const basic_string<charT,traits,Allocator>& rhs); // constexpr since C++20 16 17 // template<class charT, class traits, class Allocator> 18 // basic_string<charT,traits,Allocator>&& 19 // operator+(const charT* lhs, basic_string<charT,traits,Allocator>&& rhs); // constexpr since C++20 20 21 #include <string> 22 #include <utility> 23 #include <cassert> 24 25 #include "test_macros.h" 26 #include "min_allocator.h" 27 28 template <class S> 29 TEST_CONSTEXPR_CXX20 void test0(const typename S::value_type* lhs, const S& rhs, const S& x) { 30 assert(lhs + rhs == x); 31 } 32 33 #if TEST_STD_VER >= 11 34 template <class S> 35 TEST_CONSTEXPR_CXX20 void test1(const typename S::value_type* lhs, S&& rhs, const S& x) { 36 assert(lhs + std::move(rhs) == x); 37 } 38 #endif 39 40 TEST_CONSTEXPR_CXX20 bool test() { 41 { 42 typedef std::string S; 43 test0("", S(""), S("")); 44 test0("", S("12345"), S("12345")); 45 test0("", S("1234567890"), S("1234567890")); 46 test0("", S("12345678901234567890"), S("12345678901234567890")); 47 test0("abcde", S(""), S("abcde")); 48 test0("abcde", S("12345"), S("abcde12345")); 49 test0("abcde", S("1234567890"), S("abcde1234567890")); 50 test0("abcde", S("12345678901234567890"), S("abcde12345678901234567890")); 51 test0("abcdefghij", S(""), S("abcdefghij")); 52 test0("abcdefghij", S("12345"), S("abcdefghij12345")); 53 test0("abcdefghij", S("1234567890"), S("abcdefghij1234567890")); 54 test0("abcdefghij", S("12345678901234567890"), 55 S("abcdefghij12345678901234567890")); 56 test0("abcdefghijklmnopqrst", S(""), S("abcdefghijklmnopqrst")); 57 test0("abcdefghijklmnopqrst", S("12345"), S("abcdefghijklmnopqrst12345")); 58 test0("abcdefghijklmnopqrst", S("1234567890"), 59 S("abcdefghijklmnopqrst1234567890")); 60 test0("abcdefghijklmnopqrst", S("12345678901234567890"), 61 S("abcdefghijklmnopqrst12345678901234567890")); 62 } 63 64 #if TEST_STD_VER >= 11 65 { 66 typedef std::string S; 67 test1("", S(""), S("")); 68 test1("", S("12345"), S("12345")); 69 test1("", S("1234567890"), S("1234567890")); 70 test1("", S("12345678901234567890"), S("12345678901234567890")); 71 test1("abcde", S(""), S("abcde")); 72 test1("abcde", S("12345"), S("abcde12345")); 73 test1("abcde", S("1234567890"), S("abcde1234567890")); 74 test1("abcde", S("12345678901234567890"), S("abcde12345678901234567890")); 75 test1("abcdefghij", S(""), S("abcdefghij")); 76 test1("abcdefghij", S("12345"), S("abcdefghij12345")); 77 test1("abcdefghij", S("1234567890"), S("abcdefghij1234567890")); 78 test1("abcdefghij", S("12345678901234567890"), 79 S("abcdefghij12345678901234567890")); 80 test1("abcdefghijklmnopqrst", S(""), S("abcdefghijklmnopqrst")); 81 test1("abcdefghijklmnopqrst", S("12345"), S("abcdefghijklmnopqrst12345")); 82 test1("abcdefghijklmnopqrst", S("1234567890"), 83 S("abcdefghijklmnopqrst1234567890")); 84 test1("abcdefghijklmnopqrst", S("12345678901234567890"), 85 S("abcdefghijklmnopqrst12345678901234567890")); 86 } 87 { 88 typedef std::basic_string<char, std::char_traits<char>, 89 min_allocator<char> > 90 S; 91 test0("", S(""), S("")); 92 test0("", S("12345"), S("12345")); 93 test0("", S("1234567890"), S("1234567890")); 94 test0("", S("12345678901234567890"), S("12345678901234567890")); 95 test0("abcde", S(""), S("abcde")); 96 test0("abcde", S("12345"), S("abcde12345")); 97 test0("abcde", S("1234567890"), S("abcde1234567890")); 98 test0("abcde", S("12345678901234567890"), S("abcde12345678901234567890")); 99 test0("abcdefghij", S(""), S("abcdefghij")); 100 test0("abcdefghij", S("12345"), S("abcdefghij12345")); 101 test0("abcdefghij", S("1234567890"), S("abcdefghij1234567890")); 102 test0("abcdefghij", S("12345678901234567890"), 103 S("abcdefghij12345678901234567890")); 104 test0("abcdefghijklmnopqrst", S(""), S("abcdefghijklmnopqrst")); 105 test0("abcdefghijklmnopqrst", S("12345"), S("abcdefghijklmnopqrst12345")); 106 test0("abcdefghijklmnopqrst", S("1234567890"), 107 S("abcdefghijklmnopqrst1234567890")); 108 test0("abcdefghijklmnopqrst", S("12345678901234567890"), 109 S("abcdefghijklmnopqrst12345678901234567890")); 110 111 test1("", S(""), S("")); 112 test1("", S("12345"), S("12345")); 113 test1("", S("1234567890"), S("1234567890")); 114 test1("", S("12345678901234567890"), S("12345678901234567890")); 115 test1("abcde", S(""), S("abcde")); 116 test1("abcde", S("12345"), S("abcde12345")); 117 test1("abcde", S("1234567890"), S("abcde1234567890")); 118 test1("abcde", S("12345678901234567890"), S("abcde12345678901234567890")); 119 test1("abcdefghij", S(""), S("abcdefghij")); 120 test1("abcdefghij", S("12345"), S("abcdefghij12345")); 121 test1("abcdefghij", S("1234567890"), S("abcdefghij1234567890")); 122 test1("abcdefghij", S("12345678901234567890"), 123 S("abcdefghij12345678901234567890")); 124 test1("abcdefghijklmnopqrst", S(""), S("abcdefghijklmnopqrst")); 125 test1("abcdefghijklmnopqrst", S("12345"), S("abcdefghijklmnopqrst12345")); 126 test1("abcdefghijklmnopqrst", S("1234567890"), 127 S("abcdefghijklmnopqrst1234567890")); 128 test1("abcdefghijklmnopqrst", S("12345678901234567890"), 129 S("abcdefghijklmnopqrst12345678901234567890")); 130 } 131 #endif 132 133 return true; 134 } 135 136 int main(int, char**) { 137 test(); 138 #if TEST_STD_VER > 17 139 static_assert(test()); 140 #endif 141 142 return 0; 143 } 144