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>
13*425620ccSNikolas Klauser // operator+(const charT* lhs, const basic_string<charT,traits,Allocator>& rhs); // constexpr since C++20
145a83710eSEric Fiselier
155a83710eSEric Fiselier // template<class charT, class traits, class Allocator>
165a83710eSEric Fiselier // basic_string<charT,traits,Allocator>&&
17*425620ccSNikolas Klauser // operator+(const charT* lhs, basic_string<charT,traits,Allocator>&& rhs); // constexpr since C++20
185a83710eSEric Fiselier
195a83710eSEric Fiselier #include <string>
20e21582e7SMarshall Clow #include <utility>
215a83710eSEric Fiselier #include <cassert>
225a83710eSEric Fiselier
23414d17c6SEric Fiselier #include "test_macros.h"
245a83710eSEric Fiselier #include "min_allocator.h"
255a83710eSEric Fiselier
265a83710eSEric Fiselier template <class S>
test0(const typename S::value_type * lhs,const S & rhs,const S & x)2730046a31SNikolas Klauser TEST_CONSTEXPR_CXX20 void test0(const typename S::value_type* lhs, const S& rhs, const S& x) {
285a83710eSEric Fiselier assert(lhs + rhs == x);
295a83710eSEric Fiselier }
305a83710eSEric Fiselier
31414d17c6SEric Fiselier #if TEST_STD_VER >= 11
325a83710eSEric Fiselier template <class S>
test1(const typename S::value_type * lhs,S && rhs,const S & x)3330046a31SNikolas Klauser TEST_CONSTEXPR_CXX20 void test1(const typename S::value_type* lhs, S&& rhs, const S& x) {
3478533711SArthur O'Dwyer assert(lhs + std::move(rhs) == x);
355a83710eSEric Fiselier }
36414d17c6SEric Fiselier #endif
375a83710eSEric Fiselier
test()38*425620ccSNikolas Klauser TEST_CONSTEXPR_CXX20 bool test() {
395a83710eSEric Fiselier {
405a83710eSEric Fiselier typedef std::string S;
415a83710eSEric Fiselier test0("", S(""), S(""));
425a83710eSEric Fiselier test0("", S("12345"), S("12345"));
435a83710eSEric Fiselier test0("", S("1234567890"), S("1234567890"));
445a83710eSEric Fiselier test0("", S("12345678901234567890"), S("12345678901234567890"));
455a83710eSEric Fiselier test0("abcde", S(""), S("abcde"));
465a83710eSEric Fiselier test0("abcde", S("12345"), S("abcde12345"));
475a83710eSEric Fiselier test0("abcde", S("1234567890"), S("abcde1234567890"));
485a83710eSEric Fiselier test0("abcde", S("12345678901234567890"), S("abcde12345678901234567890"));
495a83710eSEric Fiselier test0("abcdefghij", S(""), S("abcdefghij"));
505a83710eSEric Fiselier test0("abcdefghij", S("12345"), S("abcdefghij12345"));
515a83710eSEric Fiselier test0("abcdefghij", S("1234567890"), S("abcdefghij1234567890"));
52414d17c6SEric Fiselier test0("abcdefghij", S("12345678901234567890"),
53414d17c6SEric Fiselier S("abcdefghij12345678901234567890"));
545a83710eSEric Fiselier test0("abcdefghijklmnopqrst", S(""), S("abcdefghijklmnopqrst"));
555a83710eSEric Fiselier test0("abcdefghijklmnopqrst", S("12345"), S("abcdefghijklmnopqrst12345"));
56414d17c6SEric Fiselier test0("abcdefghijklmnopqrst", S("1234567890"),
57414d17c6SEric Fiselier S("abcdefghijklmnopqrst1234567890"));
58414d17c6SEric Fiselier test0("abcdefghijklmnopqrst", S("12345678901234567890"),
59414d17c6SEric Fiselier S("abcdefghijklmnopqrst12345678901234567890"));
60414d17c6SEric Fiselier }
615a83710eSEric Fiselier
62414d17c6SEric Fiselier #if TEST_STD_VER >= 11
63414d17c6SEric Fiselier {
64414d17c6SEric Fiselier typedef std::string S;
655a83710eSEric Fiselier test1("", S(""), S(""));
665a83710eSEric Fiselier test1("", S("12345"), S("12345"));
675a83710eSEric Fiselier test1("", S("1234567890"), S("1234567890"));
685a83710eSEric Fiselier test1("", S("12345678901234567890"), S("12345678901234567890"));
695a83710eSEric Fiselier test1("abcde", S(""), S("abcde"));
705a83710eSEric Fiselier test1("abcde", S("12345"), S("abcde12345"));
715a83710eSEric Fiselier test1("abcde", S("1234567890"), S("abcde1234567890"));
725a83710eSEric Fiselier test1("abcde", S("12345678901234567890"), S("abcde12345678901234567890"));
735a83710eSEric Fiselier test1("abcdefghij", S(""), S("abcdefghij"));
745a83710eSEric Fiselier test1("abcdefghij", S("12345"), S("abcdefghij12345"));
755a83710eSEric Fiselier test1("abcdefghij", S("1234567890"), S("abcdefghij1234567890"));
76414d17c6SEric Fiselier test1("abcdefghij", S("12345678901234567890"),
77414d17c6SEric Fiselier S("abcdefghij12345678901234567890"));
785a83710eSEric Fiselier test1("abcdefghijklmnopqrst", S(""), S("abcdefghijklmnopqrst"));
795a83710eSEric Fiselier test1("abcdefghijklmnopqrst", S("12345"), S("abcdefghijklmnopqrst12345"));
80414d17c6SEric Fiselier test1("abcdefghijklmnopqrst", S("1234567890"),
81414d17c6SEric Fiselier S("abcdefghijklmnopqrst1234567890"));
82414d17c6SEric Fiselier test1("abcdefghijklmnopqrst", S("12345678901234567890"),
83414d17c6SEric Fiselier S("abcdefghijklmnopqrst12345678901234567890"));
845a83710eSEric Fiselier }
855a83710eSEric Fiselier {
86414d17c6SEric Fiselier typedef std::basic_string<char, std::char_traits<char>,
87414d17c6SEric Fiselier min_allocator<char> >
88414d17c6SEric Fiselier S;
895a83710eSEric Fiselier test0("", S(""), S(""));
905a83710eSEric Fiselier test0("", S("12345"), S("12345"));
915a83710eSEric Fiselier test0("", S("1234567890"), S("1234567890"));
925a83710eSEric Fiselier test0("", S("12345678901234567890"), S("12345678901234567890"));
935a83710eSEric Fiselier test0("abcde", S(""), S("abcde"));
945a83710eSEric Fiselier test0("abcde", S("12345"), S("abcde12345"));
955a83710eSEric Fiselier test0("abcde", S("1234567890"), S("abcde1234567890"));
965a83710eSEric Fiselier test0("abcde", S("12345678901234567890"), S("abcde12345678901234567890"));
975a83710eSEric Fiselier test0("abcdefghij", S(""), S("abcdefghij"));
985a83710eSEric Fiselier test0("abcdefghij", S("12345"), S("abcdefghij12345"));
995a83710eSEric Fiselier test0("abcdefghij", S("1234567890"), S("abcdefghij1234567890"));
100414d17c6SEric Fiselier test0("abcdefghij", S("12345678901234567890"),
101414d17c6SEric Fiselier S("abcdefghij12345678901234567890"));
1025a83710eSEric Fiselier test0("abcdefghijklmnopqrst", S(""), S("abcdefghijklmnopqrst"));
1035a83710eSEric Fiselier test0("abcdefghijklmnopqrst", S("12345"), S("abcdefghijklmnopqrst12345"));
104414d17c6SEric Fiselier test0("abcdefghijklmnopqrst", S("1234567890"),
105414d17c6SEric Fiselier S("abcdefghijklmnopqrst1234567890"));
106414d17c6SEric Fiselier test0("abcdefghijklmnopqrst", S("12345678901234567890"),
107414d17c6SEric Fiselier S("abcdefghijklmnopqrst12345678901234567890"));
1085a83710eSEric Fiselier
1095a83710eSEric Fiselier test1("", S(""), S(""));
1105a83710eSEric Fiselier test1("", S("12345"), S("12345"));
1115a83710eSEric Fiselier test1("", S("1234567890"), S("1234567890"));
1125a83710eSEric Fiselier test1("", S("12345678901234567890"), S("12345678901234567890"));
1135a83710eSEric Fiselier test1("abcde", S(""), S("abcde"));
1145a83710eSEric Fiselier test1("abcde", S("12345"), S("abcde12345"));
1155a83710eSEric Fiselier test1("abcde", S("1234567890"), S("abcde1234567890"));
1165a83710eSEric Fiselier test1("abcde", S("12345678901234567890"), S("abcde12345678901234567890"));
1175a83710eSEric Fiselier test1("abcdefghij", S(""), S("abcdefghij"));
1185a83710eSEric Fiselier test1("abcdefghij", S("12345"), S("abcdefghij12345"));
1195a83710eSEric Fiselier test1("abcdefghij", S("1234567890"), S("abcdefghij1234567890"));
120414d17c6SEric Fiselier test1("abcdefghij", S("12345678901234567890"),
121414d17c6SEric Fiselier S("abcdefghij12345678901234567890"));
1225a83710eSEric Fiselier test1("abcdefghijklmnopqrst", S(""), S("abcdefghijklmnopqrst"));
1235a83710eSEric Fiselier test1("abcdefghijklmnopqrst", S("12345"), S("abcdefghijklmnopqrst12345"));
124414d17c6SEric Fiselier test1("abcdefghijklmnopqrst", S("1234567890"),
125414d17c6SEric Fiselier S("abcdefghijklmnopqrst1234567890"));
126414d17c6SEric Fiselier test1("abcdefghijklmnopqrst", S("12345678901234567890"),
127414d17c6SEric Fiselier S("abcdefghijklmnopqrst12345678901234567890"));
1285a83710eSEric Fiselier }
1295a83710eSEric Fiselier #endif
1302df59c50SJF Bastien
13130046a31SNikolas Klauser return true;
13230046a31SNikolas Klauser }
13330046a31SNikolas Klauser
main(int,char **)13430046a31SNikolas Klauser int main(int, char**) {
13530046a31SNikolas Klauser test();
13630046a31SNikolas Klauser #if TEST_STD_VER > 17
137*425620ccSNikolas Klauser static_assert(test());
13830046a31SNikolas Klauser #endif
13930046a31SNikolas Klauser
1402df59c50SJF Bastien return 0;
1415a83710eSEric Fiselier }
142