15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier 
95a83710eSEric Fiselier // <string>
105a83710eSEric Fiselier 
115a83710eSEric Fiselier // template<class charT, class traits, class Allocator>
125a83710eSEric Fiselier //   basic_string<charT,traits,Allocator>
135a83710eSEric Fiselier //   operator+(const basic_string<charT,traits,Allocator>& lhs,
14*425620ccSNikolas Klauser //             const basic_string<charT,traits,Allocator>& rhs); // constexpr since C++20
155a83710eSEric Fiselier 
165a83710eSEric Fiselier // template<class charT, class traits, class Allocator>
175a83710eSEric Fiselier //   basic_string<charT,traits,Allocator>&&
185a83710eSEric Fiselier //   operator+(const basic_string<charT,traits,Allocator>&& lhs,
19*425620ccSNikolas Klauser //             const basic_string<charT,traits,Allocator>& rhs); // constexpr since C++20
205a83710eSEric Fiselier 
215a83710eSEric Fiselier // template<class charT, class traits, class Allocator>
225a83710eSEric Fiselier //   basic_string<charT,traits,Allocator>&&
235a83710eSEric Fiselier //   operator+(const basic_string<charT,traits,Allocator>& lhs,
24*425620ccSNikolas Klauser //             const basic_string<charT,traits,Allocator>&& rhs); // constexpr since C++20
255a83710eSEric Fiselier 
265a83710eSEric Fiselier // template<class charT, class traits, class Allocator>
275a83710eSEric Fiselier //   basic_string<charT,traits,Allocator>&&
285a83710eSEric Fiselier //   operator+(const basic_string<charT,traits,Allocator>&& lhs,
29*425620ccSNikolas Klauser //             const basic_string<charT,traits,Allocator>&& rhs); // constexpr since C++20
305a83710eSEric Fiselier 
315a83710eSEric Fiselier #include <string>
32e21582e7SMarshall Clow #include <utility>
335a83710eSEric Fiselier #include <cassert>
345a83710eSEric Fiselier 
35414d17c6SEric Fiselier #include "test_macros.h"
365a83710eSEric Fiselier #include "min_allocator.h"
375a83710eSEric Fiselier 
385a83710eSEric Fiselier template <class S>
test0(const S & lhs,const S & rhs,const S & x)3930046a31SNikolas Klauser TEST_CONSTEXPR_CXX20 void test0(const S& lhs, const S& rhs, const S& x) {
405a83710eSEric Fiselier   assert(lhs + rhs == x);
415a83710eSEric Fiselier }
425a83710eSEric Fiselier 
43414d17c6SEric Fiselier #if TEST_STD_VER >= 11
445a83710eSEric Fiselier template <class S>
test1(S && lhs,const S & rhs,const S & x)4530046a31SNikolas Klauser TEST_CONSTEXPR_CXX20 void test1(S&& lhs, const S& rhs, const S& x) {
4678533711SArthur O'Dwyer   assert(std::move(lhs) + rhs == x);
475a83710eSEric Fiselier }
485a83710eSEric Fiselier 
495a83710eSEric Fiselier template <class S>
test2(const S & lhs,S && rhs,const S & x)5030046a31SNikolas Klauser TEST_CONSTEXPR_CXX20 void test2(const S& lhs, S&& rhs, const S& x) {
5178533711SArthur O'Dwyer   assert(lhs + std::move(rhs) == x);
525a83710eSEric Fiselier }
535a83710eSEric Fiselier 
545a83710eSEric Fiselier template <class S>
test3(S && lhs,S && rhs,const S & x)5530046a31SNikolas Klauser TEST_CONSTEXPR_CXX20 void test3(S&& lhs, S&& rhs, const S& x) {
5678533711SArthur O'Dwyer   assert(std::move(lhs) + std::move(rhs) == x);
575a83710eSEric Fiselier }
58414d17c6SEric Fiselier #endif
595a83710eSEric Fiselier 
test()60*425620ccSNikolas Klauser TEST_CONSTEXPR_CXX20 bool test() {
615a83710eSEric Fiselier   {
625a83710eSEric Fiselier     typedef std::string S;
635a83710eSEric Fiselier     test0(S(""), S(""), S(""));
645a83710eSEric Fiselier     test0(S(""), S("12345"), S("12345"));
655a83710eSEric Fiselier     test0(S(""), S("1234567890"), S("1234567890"));
665a83710eSEric Fiselier     test0(S(""), S("12345678901234567890"), S("12345678901234567890"));
675a83710eSEric Fiselier     test0(S("abcde"), S(""), S("abcde"));
685a83710eSEric Fiselier     test0(S("abcde"), S("12345"), S("abcde12345"));
695a83710eSEric Fiselier     test0(S("abcde"), S("1234567890"), S("abcde1234567890"));
70414d17c6SEric Fiselier     test0(S("abcde"), S("12345678901234567890"),
71414d17c6SEric Fiselier           S("abcde12345678901234567890"));
725a83710eSEric Fiselier     test0(S("abcdefghij"), S(""), S("abcdefghij"));
735a83710eSEric Fiselier     test0(S("abcdefghij"), S("12345"), S("abcdefghij12345"));
745a83710eSEric Fiselier     test0(S("abcdefghij"), S("1234567890"), S("abcdefghij1234567890"));
75414d17c6SEric Fiselier     test0(S("abcdefghij"), S("12345678901234567890"),
76414d17c6SEric Fiselier           S("abcdefghij12345678901234567890"));
775a83710eSEric Fiselier     test0(S("abcdefghijklmnopqrst"), S(""), S("abcdefghijklmnopqrst"));
78414d17c6SEric Fiselier     test0(S("abcdefghijklmnopqrst"), S("12345"),
79414d17c6SEric Fiselier           S("abcdefghijklmnopqrst12345"));
80414d17c6SEric Fiselier     test0(S("abcdefghijklmnopqrst"), S("1234567890"),
81414d17c6SEric Fiselier           S("abcdefghijklmnopqrst1234567890"));
82414d17c6SEric Fiselier     test0(S("abcdefghijklmnopqrst"), S("12345678901234567890"),
83414d17c6SEric Fiselier           S("abcdefghijklmnopqrst12345678901234567890"));
84414d17c6SEric Fiselier   }
85414d17c6SEric Fiselier #if TEST_STD_VER >= 11
86414d17c6SEric Fiselier   {
87414d17c6SEric Fiselier     typedef std::string S;
885a83710eSEric Fiselier     test1(S(""), S(""), S(""));
895a83710eSEric Fiselier     test1(S(""), S("12345"), S("12345"));
905a83710eSEric Fiselier     test1(S(""), S("1234567890"), S("1234567890"));
915a83710eSEric Fiselier     test1(S(""), S("12345678901234567890"), S("12345678901234567890"));
925a83710eSEric Fiselier     test1(S("abcde"), S(""), S("abcde"));
935a83710eSEric Fiselier     test1(S("abcde"), S("12345"), S("abcde12345"));
945a83710eSEric Fiselier     test1(S("abcde"), S("1234567890"), S("abcde1234567890"));
95414d17c6SEric Fiselier     test1(S("abcde"), S("12345678901234567890"),
96414d17c6SEric Fiselier           S("abcde12345678901234567890"));
975a83710eSEric Fiselier     test1(S("abcdefghij"), S(""), S("abcdefghij"));
985a83710eSEric Fiselier     test1(S("abcdefghij"), S("12345"), S("abcdefghij12345"));
995a83710eSEric Fiselier     test1(S("abcdefghij"), S("1234567890"), S("abcdefghij1234567890"));
100414d17c6SEric Fiselier     test1(S("abcdefghij"), S("12345678901234567890"),
101414d17c6SEric Fiselier           S("abcdefghij12345678901234567890"));
1025a83710eSEric Fiselier     test1(S("abcdefghijklmnopqrst"), S(""), S("abcdefghijklmnopqrst"));
103414d17c6SEric Fiselier     test1(S("abcdefghijklmnopqrst"), S("12345"),
104414d17c6SEric Fiselier           S("abcdefghijklmnopqrst12345"));
105414d17c6SEric Fiselier     test1(S("abcdefghijklmnopqrst"), S("1234567890"),
106414d17c6SEric Fiselier           S("abcdefghijklmnopqrst1234567890"));
107414d17c6SEric Fiselier     test1(S("abcdefghijklmnopqrst"), S("12345678901234567890"),
108414d17c6SEric Fiselier           S("abcdefghijklmnopqrst12345678901234567890"));
1095a83710eSEric Fiselier 
1105a83710eSEric Fiselier     test2(S(""), S(""), S(""));
1115a83710eSEric Fiselier     test2(S(""), S("12345"), S("12345"));
1125a83710eSEric Fiselier     test2(S(""), S("1234567890"), S("1234567890"));
1135a83710eSEric Fiselier     test2(S(""), S("12345678901234567890"), S("12345678901234567890"));
1145a83710eSEric Fiselier     test2(S("abcde"), S(""), S("abcde"));
1155a83710eSEric Fiselier     test2(S("abcde"), S("12345"), S("abcde12345"));
1165a83710eSEric Fiselier     test2(S("abcde"), S("1234567890"), S("abcde1234567890"));
117414d17c6SEric Fiselier     test2(S("abcde"), S("12345678901234567890"),
118414d17c6SEric Fiselier           S("abcde12345678901234567890"));
1195a83710eSEric Fiselier     test2(S("abcdefghij"), S(""), S("abcdefghij"));
1205a83710eSEric Fiselier     test2(S("abcdefghij"), S("12345"), S("abcdefghij12345"));
1215a83710eSEric Fiselier     test2(S("abcdefghij"), S("1234567890"), S("abcdefghij1234567890"));
122414d17c6SEric Fiselier     test2(S("abcdefghij"), S("12345678901234567890"),
123414d17c6SEric Fiselier           S("abcdefghij12345678901234567890"));
1245a83710eSEric Fiselier     test2(S("abcdefghijklmnopqrst"), S(""), S("abcdefghijklmnopqrst"));
125414d17c6SEric Fiselier     test2(S("abcdefghijklmnopqrst"), S("12345"),
126414d17c6SEric Fiselier           S("abcdefghijklmnopqrst12345"));
127414d17c6SEric Fiselier     test2(S("abcdefghijklmnopqrst"), S("1234567890"),
128414d17c6SEric Fiselier           S("abcdefghijklmnopqrst1234567890"));
129414d17c6SEric Fiselier     test2(S("abcdefghijklmnopqrst"), S("12345678901234567890"),
130414d17c6SEric Fiselier           S("abcdefghijklmnopqrst12345678901234567890"));
1315a83710eSEric Fiselier 
1325a83710eSEric Fiselier     test3(S(""), S(""), S(""));
1335a83710eSEric Fiselier     test3(S(""), S("12345"), S("12345"));
1345a83710eSEric Fiselier     test3(S(""), S("1234567890"), S("1234567890"));
1355a83710eSEric Fiselier     test3(S(""), S("12345678901234567890"), S("12345678901234567890"));
1365a83710eSEric Fiselier     test3(S("abcde"), S(""), S("abcde"));
1375a83710eSEric Fiselier     test3(S("abcde"), S("12345"), S("abcde12345"));
1385a83710eSEric Fiselier     test3(S("abcde"), S("1234567890"), S("abcde1234567890"));
139414d17c6SEric Fiselier     test3(S("abcde"), S("12345678901234567890"),
140414d17c6SEric Fiselier           S("abcde12345678901234567890"));
1415a83710eSEric Fiselier     test3(S("abcdefghij"), S(""), S("abcdefghij"));
1425a83710eSEric Fiselier     test3(S("abcdefghij"), S("12345"), S("abcdefghij12345"));
1435a83710eSEric Fiselier     test3(S("abcdefghij"), S("1234567890"), S("abcdefghij1234567890"));
144414d17c6SEric Fiselier     test3(S("abcdefghij"), S("12345678901234567890"),
145414d17c6SEric Fiselier           S("abcdefghij12345678901234567890"));
1465a83710eSEric Fiselier     test3(S("abcdefghijklmnopqrst"), S(""), S("abcdefghijklmnopqrst"));
147414d17c6SEric Fiselier     test3(S("abcdefghijklmnopqrst"), S("12345"),
148414d17c6SEric Fiselier           S("abcdefghijklmnopqrst12345"));
149414d17c6SEric Fiselier     test3(S("abcdefghijklmnopqrst"), S("1234567890"),
150414d17c6SEric Fiselier           S("abcdefghijklmnopqrst1234567890"));
151414d17c6SEric Fiselier     test3(S("abcdefghijklmnopqrst"), S("12345678901234567890"),
152414d17c6SEric Fiselier           S("abcdefghijklmnopqrst12345678901234567890"));
1535a83710eSEric Fiselier   }
1545a83710eSEric Fiselier   {
155414d17c6SEric Fiselier     typedef std::basic_string<char, std::char_traits<char>,
156414d17c6SEric Fiselier                               min_allocator<char> >
157414d17c6SEric Fiselier         S;
1585a83710eSEric Fiselier     test0(S(""), S(""), S(""));
1595a83710eSEric Fiselier     test0(S(""), S("12345"), S("12345"));
1605a83710eSEric Fiselier     test0(S(""), S("1234567890"), S("1234567890"));
1615a83710eSEric Fiselier     test0(S(""), S("12345678901234567890"), S("12345678901234567890"));
1625a83710eSEric Fiselier     test0(S("abcde"), S(""), S("abcde"));
1635a83710eSEric Fiselier     test0(S("abcde"), S("12345"), S("abcde12345"));
1645a83710eSEric Fiselier     test0(S("abcde"), S("1234567890"), S("abcde1234567890"));
165414d17c6SEric Fiselier     test0(S("abcde"), S("12345678901234567890"),
166414d17c6SEric Fiselier           S("abcde12345678901234567890"));
1675a83710eSEric Fiselier     test0(S("abcdefghij"), S(""), S("abcdefghij"));
1685a83710eSEric Fiselier     test0(S("abcdefghij"), S("12345"), S("abcdefghij12345"));
1695a83710eSEric Fiselier     test0(S("abcdefghij"), S("1234567890"), S("abcdefghij1234567890"));
170414d17c6SEric Fiselier     test0(S("abcdefghij"), S("12345678901234567890"),
171414d17c6SEric Fiselier           S("abcdefghij12345678901234567890"));
1725a83710eSEric Fiselier     test0(S("abcdefghijklmnopqrst"), S(""), S("abcdefghijklmnopqrst"));
173414d17c6SEric Fiselier     test0(S("abcdefghijklmnopqrst"), S("12345"),
174414d17c6SEric Fiselier           S("abcdefghijklmnopqrst12345"));
175414d17c6SEric Fiselier     test0(S("abcdefghijklmnopqrst"), S("1234567890"),
176414d17c6SEric Fiselier           S("abcdefghijklmnopqrst1234567890"));
177414d17c6SEric Fiselier     test0(S("abcdefghijklmnopqrst"), S("12345678901234567890"),
178414d17c6SEric Fiselier           S("abcdefghijklmnopqrst12345678901234567890"));
1795a83710eSEric Fiselier 
1805a83710eSEric Fiselier     test1(S(""), S(""), S(""));
1815a83710eSEric Fiselier     test1(S(""), S("12345"), S("12345"));
1825a83710eSEric Fiselier     test1(S(""), S("1234567890"), S("1234567890"));
1835a83710eSEric Fiselier     test1(S(""), S("12345678901234567890"), S("12345678901234567890"));
1845a83710eSEric Fiselier     test1(S("abcde"), S(""), S("abcde"));
1855a83710eSEric Fiselier     test1(S("abcde"), S("12345"), S("abcde12345"));
1865a83710eSEric Fiselier     test1(S("abcde"), S("1234567890"), S("abcde1234567890"));
187414d17c6SEric Fiselier     test1(S("abcde"), S("12345678901234567890"),
188414d17c6SEric Fiselier           S("abcde12345678901234567890"));
1895a83710eSEric Fiselier     test1(S("abcdefghij"), S(""), S("abcdefghij"));
1905a83710eSEric Fiselier     test1(S("abcdefghij"), S("12345"), S("abcdefghij12345"));
1915a83710eSEric Fiselier     test1(S("abcdefghij"), S("1234567890"), S("abcdefghij1234567890"));
192414d17c6SEric Fiselier     test1(S("abcdefghij"), S("12345678901234567890"),
193414d17c6SEric Fiselier           S("abcdefghij12345678901234567890"));
1945a83710eSEric Fiselier     test1(S("abcdefghijklmnopqrst"), S(""), S("abcdefghijklmnopqrst"));
195414d17c6SEric Fiselier     test1(S("abcdefghijklmnopqrst"), S("12345"),
196414d17c6SEric Fiselier           S("abcdefghijklmnopqrst12345"));
197414d17c6SEric Fiselier     test1(S("abcdefghijklmnopqrst"), S("1234567890"),
198414d17c6SEric Fiselier           S("abcdefghijklmnopqrst1234567890"));
199414d17c6SEric Fiselier     test1(S("abcdefghijklmnopqrst"), S("12345678901234567890"),
200414d17c6SEric Fiselier           S("abcdefghijklmnopqrst12345678901234567890"));
2015a83710eSEric Fiselier 
2025a83710eSEric Fiselier     test2(S(""), S(""), S(""));
2035a83710eSEric Fiselier     test2(S(""), S("12345"), S("12345"));
2045a83710eSEric Fiselier     test2(S(""), S("1234567890"), S("1234567890"));
2055a83710eSEric Fiselier     test2(S(""), S("12345678901234567890"), S("12345678901234567890"));
2065a83710eSEric Fiselier     test2(S("abcde"), S(""), S("abcde"));
2075a83710eSEric Fiselier     test2(S("abcde"), S("12345"), S("abcde12345"));
2085a83710eSEric Fiselier     test2(S("abcde"), S("1234567890"), S("abcde1234567890"));
209414d17c6SEric Fiselier     test2(S("abcde"), S("12345678901234567890"),
210414d17c6SEric Fiselier           S("abcde12345678901234567890"));
2115a83710eSEric Fiselier     test2(S("abcdefghij"), S(""), S("abcdefghij"));
2125a83710eSEric Fiselier     test2(S("abcdefghij"), S("12345"), S("abcdefghij12345"));
2135a83710eSEric Fiselier     test2(S("abcdefghij"), S("1234567890"), S("abcdefghij1234567890"));
214414d17c6SEric Fiselier     test2(S("abcdefghij"), S("12345678901234567890"),
215414d17c6SEric Fiselier           S("abcdefghij12345678901234567890"));
2165a83710eSEric Fiselier     test2(S("abcdefghijklmnopqrst"), S(""), S("abcdefghijklmnopqrst"));
217414d17c6SEric Fiselier     test2(S("abcdefghijklmnopqrst"), S("12345"),
218414d17c6SEric Fiselier           S("abcdefghijklmnopqrst12345"));
219414d17c6SEric Fiselier     test2(S("abcdefghijklmnopqrst"), S("1234567890"),
220414d17c6SEric Fiselier           S("abcdefghijklmnopqrst1234567890"));
221414d17c6SEric Fiselier     test2(S("abcdefghijklmnopqrst"), S("12345678901234567890"),
222414d17c6SEric Fiselier           S("abcdefghijklmnopqrst12345678901234567890"));
2235a83710eSEric Fiselier 
2245a83710eSEric Fiselier     test3(S(""), S(""), S(""));
2255a83710eSEric Fiselier     test3(S(""), S("12345"), S("12345"));
2265a83710eSEric Fiselier     test3(S(""), S("1234567890"), S("1234567890"));
2275a83710eSEric Fiselier     test3(S(""), S("12345678901234567890"), S("12345678901234567890"));
2285a83710eSEric Fiselier     test3(S("abcde"), S(""), S("abcde"));
2295a83710eSEric Fiselier     test3(S("abcde"), S("12345"), S("abcde12345"));
2305a83710eSEric Fiselier     test3(S("abcde"), S("1234567890"), S("abcde1234567890"));
231414d17c6SEric Fiselier     test3(S("abcde"), S("12345678901234567890"),
232414d17c6SEric Fiselier           S("abcde12345678901234567890"));
2335a83710eSEric Fiselier     test3(S("abcdefghij"), S(""), S("abcdefghij"));
2345a83710eSEric Fiselier     test3(S("abcdefghij"), S("12345"), S("abcdefghij12345"));
2355a83710eSEric Fiselier     test3(S("abcdefghij"), S("1234567890"), S("abcdefghij1234567890"));
236414d17c6SEric Fiselier     test3(S("abcdefghij"), S("12345678901234567890"),
237414d17c6SEric Fiselier           S("abcdefghij12345678901234567890"));
2385a83710eSEric Fiselier     test3(S("abcdefghijklmnopqrst"), S(""), S("abcdefghijklmnopqrst"));
239414d17c6SEric Fiselier     test3(S("abcdefghijklmnopqrst"), S("12345"),
240414d17c6SEric Fiselier           S("abcdefghijklmnopqrst12345"));
241414d17c6SEric Fiselier     test3(S("abcdefghijklmnopqrst"), S("1234567890"),
242414d17c6SEric Fiselier           S("abcdefghijklmnopqrst1234567890"));
243414d17c6SEric Fiselier     test3(S("abcdefghijklmnopqrst"), S("12345678901234567890"),
244414d17c6SEric Fiselier           S("abcdefghijklmnopqrst12345678901234567890"));
2455a83710eSEric Fiselier   }
246414d17c6SEric Fiselier #endif // TEST_STD_VER >= 11
2472df59c50SJF Bastien 
24830046a31SNikolas Klauser   return true;
24930046a31SNikolas Klauser }
25030046a31SNikolas Klauser 
main(int,char **)25130046a31SNikolas Klauser int main(int, char**) {
25230046a31SNikolas Klauser   test();
25330046a31SNikolas Klauser #if TEST_STD_VER > 17
254*425620ccSNikolas Klauser   static_assert(test());
25530046a31SNikolas Klauser #endif
25630046a31SNikolas Klauser 
2572df59c50SJF Bastien   return 0;
2585a83710eSEric Fiselier }
259