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 // <string>
10
11 // template<class charT, class traits, class Allocator>
12 // basic_string<charT,traits,Allocator>
13 // operator+(const basic_string<charT,traits,Allocator>& lhs,
14 // const basic_string<charT,traits,Allocator>& rhs); // constexpr since C++20
15
16 // template<class charT, class traits, class Allocator>
17 // basic_string<charT,traits,Allocator>&&
18 // operator+(const basic_string<charT,traits,Allocator>&& lhs,
19 // const basic_string<charT,traits,Allocator>& rhs); // constexpr since C++20
20
21 // template<class charT, class traits, class Allocator>
22 // basic_string<charT,traits,Allocator>&&
23 // operator+(const basic_string<charT,traits,Allocator>& lhs,
24 // const basic_string<charT,traits,Allocator>&& rhs); // constexpr since C++20
25
26 // template<class charT, class traits, class Allocator>
27 // basic_string<charT,traits,Allocator>&&
28 // operator+(const basic_string<charT,traits,Allocator>&& lhs,
29 // const basic_string<charT,traits,Allocator>&& rhs); // constexpr since C++20
30
31 #include <string>
32 #include <utility>
33 #include <cassert>
34
35 #include "test_macros.h"
36 #include "min_allocator.h"
37
38 template <class S>
test0(const S & lhs,const S & rhs,const S & x)39 TEST_CONSTEXPR_CXX20 void test0(const S& lhs, const S& rhs, const S& x) {
40 assert(lhs + rhs == x);
41 }
42
43 #if TEST_STD_VER >= 11
44 template <class S>
test1(S && lhs,const S & rhs,const S & x)45 TEST_CONSTEXPR_CXX20 void test1(S&& lhs, const S& rhs, const S& x) {
46 assert(std::move(lhs) + rhs == x);
47 }
48
49 template <class S>
test2(const S & lhs,S && rhs,const S & x)50 TEST_CONSTEXPR_CXX20 void test2(const S& lhs, S&& rhs, const S& x) {
51 assert(lhs + std::move(rhs) == x);
52 }
53
54 template <class S>
test3(S && lhs,S && rhs,const S & x)55 TEST_CONSTEXPR_CXX20 void test3(S&& lhs, S&& rhs, const S& x) {
56 assert(std::move(lhs) + std::move(rhs) == x);
57 }
58 #endif
59
test()60 TEST_CONSTEXPR_CXX20 bool test() {
61 {
62 typedef std::string S;
63 test0(S(""), S(""), S(""));
64 test0(S(""), S("12345"), S("12345"));
65 test0(S(""), S("1234567890"), S("1234567890"));
66 test0(S(""), S("12345678901234567890"), S("12345678901234567890"));
67 test0(S("abcde"), S(""), S("abcde"));
68 test0(S("abcde"), S("12345"), S("abcde12345"));
69 test0(S("abcde"), S("1234567890"), S("abcde1234567890"));
70 test0(S("abcde"), S("12345678901234567890"),
71 S("abcde12345678901234567890"));
72 test0(S("abcdefghij"), S(""), S("abcdefghij"));
73 test0(S("abcdefghij"), S("12345"), S("abcdefghij12345"));
74 test0(S("abcdefghij"), S("1234567890"), S("abcdefghij1234567890"));
75 test0(S("abcdefghij"), S("12345678901234567890"),
76 S("abcdefghij12345678901234567890"));
77 test0(S("abcdefghijklmnopqrst"), S(""), S("abcdefghijklmnopqrst"));
78 test0(S("abcdefghijklmnopqrst"), S("12345"),
79 S("abcdefghijklmnopqrst12345"));
80 test0(S("abcdefghijklmnopqrst"), S("1234567890"),
81 S("abcdefghijklmnopqrst1234567890"));
82 test0(S("abcdefghijklmnopqrst"), S("12345678901234567890"),
83 S("abcdefghijklmnopqrst12345678901234567890"));
84 }
85 #if TEST_STD_VER >= 11
86 {
87 typedef std::string S;
88 test1(S(""), S(""), S(""));
89 test1(S(""), S("12345"), S("12345"));
90 test1(S(""), S("1234567890"), S("1234567890"));
91 test1(S(""), S("12345678901234567890"), S("12345678901234567890"));
92 test1(S("abcde"), S(""), S("abcde"));
93 test1(S("abcde"), S("12345"), S("abcde12345"));
94 test1(S("abcde"), S("1234567890"), S("abcde1234567890"));
95 test1(S("abcde"), S("12345678901234567890"),
96 S("abcde12345678901234567890"));
97 test1(S("abcdefghij"), S(""), S("abcdefghij"));
98 test1(S("abcdefghij"), S("12345"), S("abcdefghij12345"));
99 test1(S("abcdefghij"), S("1234567890"), S("abcdefghij1234567890"));
100 test1(S("abcdefghij"), S("12345678901234567890"),
101 S("abcdefghij12345678901234567890"));
102 test1(S("abcdefghijklmnopqrst"), S(""), S("abcdefghijklmnopqrst"));
103 test1(S("abcdefghijklmnopqrst"), S("12345"),
104 S("abcdefghijklmnopqrst12345"));
105 test1(S("abcdefghijklmnopqrst"), S("1234567890"),
106 S("abcdefghijklmnopqrst1234567890"));
107 test1(S("abcdefghijklmnopqrst"), S("12345678901234567890"),
108 S("abcdefghijklmnopqrst12345678901234567890"));
109
110 test2(S(""), S(""), S(""));
111 test2(S(""), S("12345"), S("12345"));
112 test2(S(""), S("1234567890"), S("1234567890"));
113 test2(S(""), S("12345678901234567890"), S("12345678901234567890"));
114 test2(S("abcde"), S(""), S("abcde"));
115 test2(S("abcde"), S("12345"), S("abcde12345"));
116 test2(S("abcde"), S("1234567890"), S("abcde1234567890"));
117 test2(S("abcde"), S("12345678901234567890"),
118 S("abcde12345678901234567890"));
119 test2(S("abcdefghij"), S(""), S("abcdefghij"));
120 test2(S("abcdefghij"), S("12345"), S("abcdefghij12345"));
121 test2(S("abcdefghij"), S("1234567890"), S("abcdefghij1234567890"));
122 test2(S("abcdefghij"), S("12345678901234567890"),
123 S("abcdefghij12345678901234567890"));
124 test2(S("abcdefghijklmnopqrst"), S(""), S("abcdefghijklmnopqrst"));
125 test2(S("abcdefghijklmnopqrst"), S("12345"),
126 S("abcdefghijklmnopqrst12345"));
127 test2(S("abcdefghijklmnopqrst"), S("1234567890"),
128 S("abcdefghijklmnopqrst1234567890"));
129 test2(S("abcdefghijklmnopqrst"), S("12345678901234567890"),
130 S("abcdefghijklmnopqrst12345678901234567890"));
131
132 test3(S(""), S(""), S(""));
133 test3(S(""), S("12345"), S("12345"));
134 test3(S(""), S("1234567890"), S("1234567890"));
135 test3(S(""), S("12345678901234567890"), S("12345678901234567890"));
136 test3(S("abcde"), S(""), S("abcde"));
137 test3(S("abcde"), S("12345"), S("abcde12345"));
138 test3(S("abcde"), S("1234567890"), S("abcde1234567890"));
139 test3(S("abcde"), S("12345678901234567890"),
140 S("abcde12345678901234567890"));
141 test3(S("abcdefghij"), S(""), S("abcdefghij"));
142 test3(S("abcdefghij"), S("12345"), S("abcdefghij12345"));
143 test3(S("abcdefghij"), S("1234567890"), S("abcdefghij1234567890"));
144 test3(S("abcdefghij"), S("12345678901234567890"),
145 S("abcdefghij12345678901234567890"));
146 test3(S("abcdefghijklmnopqrst"), S(""), S("abcdefghijklmnopqrst"));
147 test3(S("abcdefghijklmnopqrst"), S("12345"),
148 S("abcdefghijklmnopqrst12345"));
149 test3(S("abcdefghijklmnopqrst"), S("1234567890"),
150 S("abcdefghijklmnopqrst1234567890"));
151 test3(S("abcdefghijklmnopqrst"), S("12345678901234567890"),
152 S("abcdefghijklmnopqrst12345678901234567890"));
153 }
154 {
155 typedef std::basic_string<char, std::char_traits<char>,
156 min_allocator<char> >
157 S;
158 test0(S(""), S(""), S(""));
159 test0(S(""), S("12345"), S("12345"));
160 test0(S(""), S("1234567890"), S("1234567890"));
161 test0(S(""), S("12345678901234567890"), S("12345678901234567890"));
162 test0(S("abcde"), S(""), S("abcde"));
163 test0(S("abcde"), S("12345"), S("abcde12345"));
164 test0(S("abcde"), S("1234567890"), S("abcde1234567890"));
165 test0(S("abcde"), S("12345678901234567890"),
166 S("abcde12345678901234567890"));
167 test0(S("abcdefghij"), S(""), S("abcdefghij"));
168 test0(S("abcdefghij"), S("12345"), S("abcdefghij12345"));
169 test0(S("abcdefghij"), S("1234567890"), S("abcdefghij1234567890"));
170 test0(S("abcdefghij"), S("12345678901234567890"),
171 S("abcdefghij12345678901234567890"));
172 test0(S("abcdefghijklmnopqrst"), S(""), S("abcdefghijklmnopqrst"));
173 test0(S("abcdefghijklmnopqrst"), S("12345"),
174 S("abcdefghijklmnopqrst12345"));
175 test0(S("abcdefghijklmnopqrst"), S("1234567890"),
176 S("abcdefghijklmnopqrst1234567890"));
177 test0(S("abcdefghijklmnopqrst"), S("12345678901234567890"),
178 S("abcdefghijklmnopqrst12345678901234567890"));
179
180 test1(S(""), S(""), S(""));
181 test1(S(""), S("12345"), S("12345"));
182 test1(S(""), S("1234567890"), S("1234567890"));
183 test1(S(""), S("12345678901234567890"), S("12345678901234567890"));
184 test1(S("abcde"), S(""), S("abcde"));
185 test1(S("abcde"), S("12345"), S("abcde12345"));
186 test1(S("abcde"), S("1234567890"), S("abcde1234567890"));
187 test1(S("abcde"), S("12345678901234567890"),
188 S("abcde12345678901234567890"));
189 test1(S("abcdefghij"), S(""), S("abcdefghij"));
190 test1(S("abcdefghij"), S("12345"), S("abcdefghij12345"));
191 test1(S("abcdefghij"), S("1234567890"), S("abcdefghij1234567890"));
192 test1(S("abcdefghij"), S("12345678901234567890"),
193 S("abcdefghij12345678901234567890"));
194 test1(S("abcdefghijklmnopqrst"), S(""), S("abcdefghijklmnopqrst"));
195 test1(S("abcdefghijklmnopqrst"), S("12345"),
196 S("abcdefghijklmnopqrst12345"));
197 test1(S("abcdefghijklmnopqrst"), S("1234567890"),
198 S("abcdefghijklmnopqrst1234567890"));
199 test1(S("abcdefghijklmnopqrst"), S("12345678901234567890"),
200 S("abcdefghijklmnopqrst12345678901234567890"));
201
202 test2(S(""), S(""), S(""));
203 test2(S(""), S("12345"), S("12345"));
204 test2(S(""), S("1234567890"), S("1234567890"));
205 test2(S(""), S("12345678901234567890"), S("12345678901234567890"));
206 test2(S("abcde"), S(""), S("abcde"));
207 test2(S("abcde"), S("12345"), S("abcde12345"));
208 test2(S("abcde"), S("1234567890"), S("abcde1234567890"));
209 test2(S("abcde"), S("12345678901234567890"),
210 S("abcde12345678901234567890"));
211 test2(S("abcdefghij"), S(""), S("abcdefghij"));
212 test2(S("abcdefghij"), S("12345"), S("abcdefghij12345"));
213 test2(S("abcdefghij"), S("1234567890"), S("abcdefghij1234567890"));
214 test2(S("abcdefghij"), S("12345678901234567890"),
215 S("abcdefghij12345678901234567890"));
216 test2(S("abcdefghijklmnopqrst"), S(""), S("abcdefghijklmnopqrst"));
217 test2(S("abcdefghijklmnopqrst"), S("12345"),
218 S("abcdefghijklmnopqrst12345"));
219 test2(S("abcdefghijklmnopqrst"), S("1234567890"),
220 S("abcdefghijklmnopqrst1234567890"));
221 test2(S("abcdefghijklmnopqrst"), S("12345678901234567890"),
222 S("abcdefghijklmnopqrst12345678901234567890"));
223
224 test3(S(""), S(""), S(""));
225 test3(S(""), S("12345"), S("12345"));
226 test3(S(""), S("1234567890"), S("1234567890"));
227 test3(S(""), S("12345678901234567890"), S("12345678901234567890"));
228 test3(S("abcde"), S(""), S("abcde"));
229 test3(S("abcde"), S("12345"), S("abcde12345"));
230 test3(S("abcde"), S("1234567890"), S("abcde1234567890"));
231 test3(S("abcde"), S("12345678901234567890"),
232 S("abcde12345678901234567890"));
233 test3(S("abcdefghij"), S(""), S("abcdefghij"));
234 test3(S("abcdefghij"), S("12345"), S("abcdefghij12345"));
235 test3(S("abcdefghij"), S("1234567890"), S("abcdefghij1234567890"));
236 test3(S("abcdefghij"), S("12345678901234567890"),
237 S("abcdefghij12345678901234567890"));
238 test3(S("abcdefghijklmnopqrst"), S(""), S("abcdefghijklmnopqrst"));
239 test3(S("abcdefghijklmnopqrst"), S("12345"),
240 S("abcdefghijklmnopqrst12345"));
241 test3(S("abcdefghijklmnopqrst"), S("1234567890"),
242 S("abcdefghijklmnopqrst1234567890"));
243 test3(S("abcdefghijklmnopqrst"), S("12345678901234567890"),
244 S("abcdefghijklmnopqrst12345678901234567890"));
245 }
246 #endif // TEST_STD_VER >= 11
247
248 return true;
249 }
250
main(int,char **)251 int main(int, char**) {
252 test();
253 #if TEST_STD_VER > 17
254 static_assert(test());
255 #endif
256
257 return 0;
258 }
259