[libc++] Implement P0980R1 (constexpr std::string)

Reviewed By: #libc, ldionne

Spies: daltenty, sdasgup3, ldionne, arichardson, MTC, ChuanqiXu, mehdi_amini, shauheen, antiagainst, nicolasvasilache, arpith-jacob, mgester, lucyrfox, aartbik, liufengdb, stephenneuendorffer, Joonsoo, grosul1, Kayjukh, jurahul, msifontes, tatianashp, rdzhabarov, teijeong, cota, dcaballe, Chia-hungDuan, wrengr, wenzhicui, arphaman, Mordante, miscco, Quuxplusone, smeenai, libcxx-commits

Differential Revision: https://reviews.llvm.org/D110598
This commit is contained in:
Nikolas Klauser committed 2022-04-27 12:25:34 +02:00
1 parent 6e078f9804
commit 425620ccdd
211 files changed
+2291 -2074

No files matched your search

@@ -6,11 +6,13 @@
//
//===----------------------------------------------------------------------===//
// XFAIL: LIBCXX-AIX-FIXME
// UNSUPPORTED: c++03
// <string>
// basic_string& replace(const_iterator i1, const_iterator i2, initializer_list<charT> il);
// basic_string& replace(const_iterator i1, const_iterator i2, initializer_list<charT> il); // constexpr since C++20
#include <string>
#include <cassert>
@@ -18,7 +20,7 @@
#include "test_macros.h"
#include "min_allocator.h"
bool test() {
TEST_CONSTEXPR_CXX20 bool test() {
{
std::string s("123def456");
s.replace(s.cbegin() + 3, s.cbegin() + 6, {'a', 'b', 'c'});
@@ -38,7 +40,7 @@ int main(int, char**)
{
test();
#if TEST_STD_VER > 17
// static_assert(test());
static_assert(test());
#endif
return 0;
@@ -6,11 +6,13 @@
//
//===----------------------------------------------------------------------===//
// XFAIL: LIBCXX-AIX-FIXME
// <string>
// template<class InputIterator>
// basic_string&
// replace(const_iterator i1, const_iterator i2, InputIterator j1, InputIterator j2);
// replace(const_iterator i1, const_iterator i2, InputIterator j1, InputIterator j2); // constexpr since C++20
#include <string>
#include <iterator>
@@ -63,7 +65,7 @@ test_exceptions(S s, typename S::size_type pos1, typename S::size_type n1, It f,
}
#endif
const char* str = "12345678901234567890";
TEST_CONSTEXPR const char* str = "12345678901234567890";
template <class S>
TEST_CONSTEXPR_CXX20 bool test0()
@@ -993,9 +995,9 @@ TEST_CONSTEXPR_CXX20 bool test8()
}
template <class S>
bool test9() {
TEST_CONSTEXPR_CXX20 bool test9() {
#ifndef TEST_HAS_NO_EXCEPTIONS
{ // test iterator operations that throw
if (!TEST_IS_CONSTANT_EVALUATED) { // test iterator operations that throw
typedef ThrowingIterator<char> TIter;
typedef cpp17_input_iterator<TIter> IIter;
const char* s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
@@ -1057,16 +1059,16 @@ void test() {
test9<S>();
#if TEST_STD_VER > 17
// static_assert(test0<S>());
// static_assert(test1<S>());
// static_assert(test2<S>());
// static_assert(test3<S>());
// static_assert(test4<S>());
// static_assert(test5<S>());
// static_assert(test6<S>());
// static_assert(test7<S>());
// static_assert(test8<S>());
// static_assert(test9<S>());
static_assert(test0<S>());
static_assert(test1<S>());
static_assert(test2<S>());
static_assert(test3<S>());
static_assert(test4<S>());
static_assert(test5<S>());
static_assert(test6<S>());
static_assert(test7<S>());
static_assert(test8<S>());
static_assert(test9<S>());
#endif
}
@@ -6,10 +6,12 @@
//
//===----------------------------------------------------------------------===//
// XFAIL: LIBCXX-AIX-FIXME
// <string>
// basic_string<charT,traits,Allocator>&
// replace(const_iterator i1, const_iterator i2, const charT* s);
// replace(const_iterator i1, const_iterator i2, const charT* s); // constexpr since C++20
#include <stdio.h>
@@ -266,7 +268,7 @@ TEST_CONSTEXPR_CXX20 void test2()
test(S("abcdefghijklmnopqrst"), 20, 0, "12345678901234567890", S("abcdefghijklmnopqrst12345678901234567890"));
}
bool test() {
TEST_CONSTEXPR_CXX20 bool test() {
{
typedef std::string S;
test0<S>();
@@ -305,7 +307,7 @@ int main(int, char**)
{
test();
#if TEST_STD_VER > 17
// static_assert(test());
static_assert(test());
#endif
return 0;
@@ -6,10 +6,12 @@
//
//===----------------------------------------------------------------------===//
// XFAIL: LIBCXX-AIX-FIXME
// <string>
// basic_string<charT,traits,Allocator>&
// replace(const_iterator i1, const_iterator i2, const charT* s, size_type n);
// replace(const_iterator i1, const_iterator i2, const charT* s, size_type n); // constexpr since C++20
#include <string>
#include <algorithm>
@@ -962,7 +964,7 @@ TEST_CONSTEXPR_CXX20 bool test8()
}
template <class S>
bool test9() {
TEST_CONSTEXPR_CXX20 bool test9() {
S s_short = "123/";
S s_long = "Lorem ipsum dolor sit amet, consectetur/";
@@ -993,16 +995,16 @@ void test() {
test9<S>();
#if TEST_STD_VER > 17
// static_assert(test0<S>());
// static_assert(test1<S>());
// static_assert(test2<S>());
// static_assert(test3<S>());
// static_assert(test4<S>());
// static_assert(test5<S>());
// static_assert(test6<S>());
// static_assert(test7<S>());
// static_assert(test8<S>());
// static_assert(test9<S>());
static_assert(test0<S>());
static_assert(test1<S>());
static_assert(test2<S>());
static_assert(test3<S>());
static_assert(test4<S>());
static_assert(test5<S>());
static_assert(test6<S>());
static_assert(test7<S>());
static_assert(test8<S>());
static_assert(test9<S>());
#endif
}
@@ -6,10 +6,12 @@
//
//===----------------------------------------------------------------------===//
// XFAIL: LIBCXX-AIX-FIXME
// <string>
// basic_string<charT,traits,Allocator>&
// replace(const_iterator i1, const_iterator i2, size_type n, charT c);
// replace(const_iterator i1, const_iterator i2, size_type n, charT c); // constexpr since C++20
#include <string>
#include <algorithm>
@@ -35,7 +37,7 @@ test(S s, typename S::size_type pos1, typename S::size_type n1, typename S::size
}
template <class S>
void test0()
TEST_CONSTEXPR_CXX20 void test0()
{
test(S(""), 0, 0, 0, '3', S(""));
test(S(""), 0, 0, 5, '3', S("33333"));
@@ -140,7 +142,7 @@ void test0()
}
template <class S>
void test1()
TEST_CONSTEXPR_CXX20 void test1()
{
test(S("abcdefghij"), 1, 4, 0, '3', S("afghij"));
test(S("abcdefghij"), 1, 4, 5, '3', S("a33333fghij"));
@@ -245,7 +247,7 @@ void test1()
}
template <class S>
void test2()
TEST_CONSTEXPR_CXX20 void test2()
{
test(S("abcdefghijklmnopqrst"), 10, 10, 0, '3', S("abcdefghij"));
test(S("abcdefghijklmnopqrst"), 10, 10, 5, '3', S("abcdefghij33333"));
@@ -265,7 +267,7 @@ void test2()
test(S("abcdefghijklmnopqrst"), 20, 0, 20, '3', S("abcdefghijklmnopqrst33333333333333333333"));
}
bool test() {
TEST_CONSTEXPR_CXX20 bool test() {
{
typedef std::string S;
test0<S>();
@@ -288,7 +290,7 @@ int main(int, char**)
{
test();
#if TEST_STD_VER > 17
// static_assert(test());
static_assert(test());
#endif
return 0;
@@ -6,10 +6,12 @@
//
//===----------------------------------------------------------------------===//
// XFAIL: LIBCXX-AIX-FIXME
// <string>
// basic_string<charT,traits,Allocator>&
// replace(const_iterator i1, const_iterator i2, const basic_string& str);
// replace(const_iterator i1, const_iterator i2, const basic_string& str); // constexpr since C++20
#include <string>
#include <algorithm>
@@ -34,7 +36,7 @@ test(S s, typename S::size_type pos1, typename S::size_type n1, S str, S expecte
}
template <class S>
TEST_CONSTEXPR_CXX20 void test0()
TEST_CONSTEXPR_CXX20 bool test0()
{
test(S(""), 0, 0, S(""), S(""));
test(S(""), 0, 0, S("12345"), S("12345"));
@@ -136,10 +138,12 @@ TEST_CONSTEXPR_CXX20 void test0()
test(S("abcdefghij"), 1, 1, S("12345"), S("a12345cdefghij"));
test(S("abcdefghij"), 1, 1, S("1234567890"), S("a1234567890cdefghij"));
test(S("abcdefghij"), 1, 1, S("12345678901234567890"), S("a12345678901234567890cdefghij"));
return true;
}
template <class S>
TEST_CONSTEXPR_CXX20 void test1()
TEST_CONSTEXPR_CXX20 bool test1()
{
test(S("abcdefghij"), 1, 4, S(""), S("afghij"));
test(S("abcdefghij"), 1, 4, S("12345"), S("a12345fghij"));
@@ -241,10 +245,12 @@ TEST_CONSTEXPR_CXX20 void test1()
test(S("abcdefghijklmnopqrst"), 10, 9, S("12345"), S("abcdefghij12345t"));
test(S("abcdefghijklmnopqrst"), 10, 9, S("1234567890"), S("abcdefghij1234567890t"));
test(S("abcdefghijklmnopqrst"), 10, 9, S("12345678901234567890"), S("abcdefghij12345678901234567890t"));
return true;
}
template <class S>
TEST_CONSTEXPR_CXX20 void test2()
TEST_CONSTEXPR_CXX20 bool test2()
{
test(S("abcdefghijklmnopqrst"), 10, 10, S(""), S("abcdefghij"));
test(S("abcdefghijklmnopqrst"), 10, 10, S("12345"), S("abcdefghij12345"));
@@ -262,23 +268,22 @@ TEST_CONSTEXPR_CXX20 void test2()
test(S("abcdefghijklmnopqrst"), 20, 0, S("12345"), S("abcdefghijklmnopqrst12345"));
test(S("abcdefghijklmnopqrst"), 20, 0, S("1234567890"), S("abcdefghijklmnopqrst1234567890"));
test(S("abcdefghijklmnopqrst"), 20, 0, S("12345678901234567890"), S("abcdefghijklmnopqrst12345678901234567890"));
return true;
}
bool test() {
template <class S>
void test() {
{
typedef std::string S;
test0<S>();
test1<S>();
test2<S>();
}
#if TEST_STD_VER >= 11
{
typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
test0<S>();
test1<S>();
test2<S>();
}
#if TEST_STD_VER > 17
static_assert(test0<S>());
static_assert(test1<S>());
static_assert(test2<S>());
#endif
}
#if TEST_STD_VER > 3
{ // LWG 2946
@@ -288,15 +293,13 @@ bool test() {
assert(s == "a");
}
#endif
return true;
}
int main(int, char**)
{
test();
#if TEST_STD_VER > 17
// static_assert(test());
test<std::string>();
#if TEST_STD_VER >= 11
test<std::basic_string<char, std::char_traits<char>, min_allocator<char>>>();
#endif
return 0;
@@ -6,10 +6,12 @@
//
//===----------------------------------------------------------------------===//
// XFAIL: LIBCXX-AIX-FIXME
// <string>
// basic_string<charT,traits,Allocator>&
// replace(const_iterator i1, const_iterator i2, basic_string_view<charT,traits> sv);
// replace(const_iterator i1, const_iterator i2, basic_string_view<charT,traits> sv); // constexpr since C++20
#include <string>
#include <algorithm>
@@ -264,7 +266,7 @@ TEST_CONSTEXPR_CXX20 void test2()
test(S("abcdefghijklmnopqrst"), 20, 0, SV("12345678901234567890"), S("abcdefghijklmnopqrst12345678901234567890"));
}
bool test() {
TEST_CONSTEXPR_CXX20 bool test() {
{
typedef std::string S;
typedef std::string_view SV;
@@ -289,7 +291,7 @@ int main(int, char**)
{
test();
#if TEST_STD_VER > 17
// static_assert(test());
static_assert(test());
#endif
return 0;
@@ -6,11 +6,13 @@
//
//===----------------------------------------------------------------------===//
// XFAIL: LIBCXX-AIX-FIXME
// <string>
// template <class T>
// basic_string& replace(size_type pos1, size_type n1, const T& t,
// size_type pos2, size_type n=npos);
// size_type pos2, size_type n=npos); // constexpr since C++20
//
// Mostly we're testing string_view here
@@ -47,7 +49,7 @@ test(S s, typename S::size_type pos1, typename S::size_type n1,
assert(s.size() == old_size - xlen + rlen);
}
#ifndef TEST_HAS_NO_EXCEPTIONS
else
else if (!TEST_IS_CONSTANT_EVALUATED)
{
try
{
@@ -83,7 +85,7 @@ test_npos(S s, typename S::size_type pos1, typename S::size_type n1,
assert(s.size() == old_size - xlen + rlen);
}
#ifndef TEST_HAS_NO_EXCEPTIONS
else
else if (!TEST_IS_CONSTANT_EVALUATED)
{
try
{
@@ -5981,7 +5983,7 @@ TEST_CONSTEXPR_CXX20 bool test55()
return true;
}
bool test56() {
TEST_CONSTEXPR_CXX20 bool test56() {
typedef std::string S;
typedef std::string_view SV;
S s0 = "ABCD";
@@ -6017,7 +6019,7 @@ bool test56() {
}
template <class S, class SV>
bool test() {
TEST_CONSTEXPR_CXX20 bool test() {
test0<S, SV>();
test1<S, SV>();
test2<S, SV>();
@@ -6076,62 +6078,62 @@ bool test() {
test55<S, SV>();
#if TEST_STD_VER > 17
// static_assert(test0<S, SV>());
// static_assert(test1<S, SV>());
// static_assert(test2<S, SV>());
// static_assert(test3<S, SV>());
// static_assert(test4<S, SV>());
// static_assert(test5<S, SV>());
// static_assert(test6<S, SV>());
// static_assert(test7<S, SV>());
// static_assert(test8<S, SV>());
// static_assert(test9<S, SV>());
// static_assert(test10<S, SV>());
// static_assert(test11<S, SV>());
// static_assert(test12<S, SV>());
// static_assert(test13<S, SV>());
// static_assert(test14<S, SV>());
// static_assert(test15<S, SV>());
// static_assert(test16<S, SV>());
// static_assert(test17<S, SV>());
// static_assert(test18<S, SV>());
// static_assert(test19<S, SV>());
// static_assert(test20<S, SV>());
// static_assert(test21<S, SV>());
// static_assert(test22<S, SV>());
// static_assert(test23<S, SV>());
// static_assert(test24<S, SV>());
// static_assert(test25<S, SV>());
// static_assert(test26<S, SV>());
// static_assert(test27<S, SV>());
// static_assert(test28<S, SV>());
// static_assert(test29<S, SV>());
// static_assert(test30<S, SV>());
// static_assert(test31<S, SV>());
// static_assert(test32<S, SV>());
// static_assert(test33<S, SV>());
// static_assert(test34<S, SV>());
// static_assert(test35<S, SV>());
// static_assert(test36<S, SV>());
// static_assert(test37<S, SV>());
// static_assert(test38<S, SV>());
// static_assert(test39<S, SV>());
// static_assert(test40<S, SV>());
// static_assert(test41<S, SV>());
// static_assert(test42<S, SV>());
// static_assert(test43<S, SV>());
// static_assert(test44<S, SV>());
// static_assert(test45<S, SV>());
// static_assert(test46<S, SV>());
// static_assert(test47<S, SV>());
// static_assert(test48<S, SV>());
// static_assert(test49<S, SV>());
// static_assert(test50<S, SV>());
// static_assert(test51<S, SV>());
// static_assert(test52<S, SV>());
// static_assert(test53<S, SV>());
// static_assert(test54<S, SV>());
// static_assert(test55<S, SV>());
static_assert(test0<S, SV>());
static_assert(test1<S, SV>());
static_assert(test2<S, SV>());
static_assert(test3<S, SV>());
static_assert(test4<S, SV>());
static_assert(test5<S, SV>());
static_assert(test6<S, SV>());
static_assert(test7<S, SV>());
static_assert(test8<S, SV>());
static_assert(test9<S, SV>());
static_assert(test10<S, SV>());
static_assert(test11<S, SV>());
static_assert(test12<S, SV>());
static_assert(test13<S, SV>());
static_assert(test14<S, SV>());
static_assert(test15<S, SV>());
static_assert(test16<S, SV>());
static_assert(test17<S, SV>());
static_assert(test18<S, SV>());
static_assert(test19<S, SV>());
static_assert(test20<S, SV>());
static_assert(test21<S, SV>());
static_assert(test22<S, SV>());
static_assert(test23<S, SV>());
static_assert(test24<S, SV>());
static_assert(test25<S, SV>());
static_assert(test26<S, SV>());
static_assert(test27<S, SV>());
static_assert(test28<S, SV>());
static_assert(test29<S, SV>());
static_assert(test30<S, SV>());
static_assert(test31<S, SV>());
static_assert(test32<S, SV>());
static_assert(test33<S, SV>());
static_assert(test34<S, SV>());
static_assert(test35<S, SV>());
static_assert(test36<S, SV>());
static_assert(test37<S, SV>());
static_assert(test38<S, SV>());
static_assert(test39<S, SV>());
static_assert(test40<S, SV>());
static_assert(test41<S, SV>());
static_assert(test42<S, SV>());
static_assert(test43<S, SV>());
static_assert(test44<S, SV>());
static_assert(test45<S, SV>());
static_assert(test46<S, SV>());
static_assert(test47<S, SV>());
static_assert(test48<S, SV>());
static_assert(test49<S, SV>());
static_assert(test50<S, SV>());
static_assert(test51<S, SV>());
static_assert(test52<S, SV>());
static_assert(test53<S, SV>());
static_assert(test54<S, SV>());
static_assert(test55<S, SV>());
#endif
return true;
@@ -6,10 +6,12 @@
//
//===----------------------------------------------------------------------===//
// XFAIL: LIBCXX-AIX-FIXME
// <string>
// basic_string<charT,traits,Allocator>&
// replace(size_type pos, size_type n1, const charT* s);
// replace(size_type pos, size_type n1, const charT* s); // constexpr since C++20
#include <string>
#include <stdexcept>
@@ -36,7 +38,7 @@ test(S s, typename S::size_type pos, typename S::size_type n1,
assert(s.size() == old_size - xlen + rlen);
}
#ifndef TEST_HAS_NO_EXCEPTIONS
else
else if (!TEST_IS_CONSTANT_EVALUATED)
{
try
{
@@ -53,7 +55,7 @@ test(S s, typename S::size_type pos, typename S::size_type n1,
}
template <class S>
TEST_CONSTEXPR_CXX20 void test0()
TEST_CONSTEXPR_CXX20 bool test0()
{
test(S(""), 0, 0, "", S(""));
test(S(""), 0, 0, "12345", S("12345"));
@@ -155,10 +157,12 @@ TEST_CONSTEXPR_CXX20 void test0()
test(S("abcde"), 5, 1, "12345", S("abcde12345"));
test(S("abcde"), 5, 1, "1234567890", S("abcde1234567890"));
test(S("abcde"), 5, 1, "12345678901234567890", S("abcde12345678901234567890"));
return true;
}
template <class S>
TEST_CONSTEXPR_CXX20 void test1()
TEST_CONSTEXPR_CXX20 bool test1()
{
test(S("abcde"), 6, 0, "", S("can't happen"));
test(S("abcde"), 6, 0, "12345", S("can't happen"));
@@ -260,10 +264,12 @@ TEST_CONSTEXPR_CXX20 void test1()
test(S("abcdefghij"), 11, 0, "12345", S("can't happen"));
test(S("abcdefghij"), 11, 0, "1234567890", S("can't happen"));
test(S("abcdefghij"), 11, 0, "12345678901234567890", S("can't happen"));
return true;
}
template <class S>
TEST_CONSTEXPR_CXX20 void test2()
TEST_CONSTEXPR_CXX20 bool test2()
{
test(S("abcdefghijklmnopqrst"), 0, 0, "", S("abcdefghijklmnopqrst"));
test(S("abcdefghijklmnopqrst"), 0, 0, "12345", S("12345abcdefghijklmnopqrst"));
@@ -361,32 +367,29 @@ TEST_CONSTEXPR_CXX20 void test2()
test(S("abcdefghijklmnopqrst"), 21, 0, "12345", S("can't happen"));
test(S("abcdefghijklmnopqrst"), 21, 0, "1234567890", S("can't happen"));
test(S("abcdefghijklmnopqrst"), 21, 0, "12345678901234567890", S("can't happen"));
return true;
}
bool test() {
template <class S>
void test() {
{
typedef std::string S;
test0<S>();
test1<S>();
test2<S>();
}
#if TEST_STD_VER >= 11
{
typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
test0<S>();
test1<S>();
test2<S>();
}
#if TEST_STD_VER > 17
static_assert(test0<S>());
static_assert(test1<S>());
static_assert(test2<S>());
#endif
return true;
}
}
int main(int, char**)
{
test();
#if TEST_STD_VER > 17
// static_assert(test());
test<std::string>();
#if TEST_STD_VER >= 11
test<std::basic_string<char, std::char_traits<char>, min_allocator<char>>>();
#endif
return 0;
@@ -6,10 +6,12 @@
//
//===----------------------------------------------------------------------===//
// XFAIL: LIBCXX-AIX-FIXME
// <string>
// basic_string<charT,traits,Allocator>&
// replace(size_type pos, size_type n1, const charT* s, size_type n2);
// replace(size_type pos, size_type n1, const charT* s, size_type n2); // constexpr since C++20
#include <string>
#include <stdexcept>
@@ -37,7 +39,7 @@ test(S s, typename S::size_type pos, typename S::size_type n1,
assert(s.size() == old_size - xlen + rlen);
}
#ifndef TEST_HAS_NO_EXCEPTIONS
else
else if (!TEST_IS_CONSTANT_EVALUATED)
{
try
{
@@ -1337,18 +1339,18 @@ void test() {
test11<S>();
#if TEST_STD_VER > 17
// static_assert(test0<S>());
// static_assert(test1<S>());
// static_assert(test2<S>());
// static_assert(test3<S>());
// static_assert(test4<S>());
// static_assert(test5<S>());
// static_assert(test6<S>());
// static_assert(test7<S>());
// static_assert(test8<S>());
// static_assert(test9<S>());
// static_assert(test10<S>());
// static_assert(test11<S>());
static_assert(test0<S>());
static_assert(test1<S>());
static_assert(test2<S>());
static_assert(test3<S>());
static_assert(test4<S>());
static_assert(test5<S>());
static_assert(test6<S>());
static_assert(test7<S>());
static_assert(test8<S>());
static_assert(test9<S>());
static_assert(test10<S>());
static_assert(test11<S>());
#endif
}
@@ -6,10 +6,12 @@
//
//===----------------------------------------------------------------------===//
// XFAIL: LIBCXX-AIX-FIXME
// <string>
// basic_string<charT,traits,Allocator>&
// replace(size_type pos, size_type n1, size_type n2, charT c);
// replace(size_type pos, size_type n1, size_type n2, charT c); // constexpr since C++20
#include <string>
#include <stdexcept>
@@ -37,7 +39,7 @@ test(S s, typename S::size_type pos, typename S::size_type n1,
assert(s.size() == old_size - xlen + rlen);
}
#ifndef TEST_HAS_NO_EXCEPTIONS
else
else if (!TEST_IS_CONSTANT_EVALUATED)
{
try
{
@@ -54,7 +56,7 @@ test(S s, typename S::size_type pos, typename S::size_type n1,
}
template <class S>
TEST_CONSTEXPR_CXX20 void test0()
TEST_CONSTEXPR_CXX20 bool test0()
{
test(S(""), 0, 0, 0, '2', S(""));
test(S(""), 0, 0, 5, '2', S("22222"));
@@ -156,10 +158,12 @@ TEST_CONSTEXPR_CXX20 void test0()
test(S("abcde"), 5, 1, 5, '2', S("abcde22222"));
test(S("abcde"), 5, 1, 10, '2', S("abcde2222222222"));
test(S("abcde"), 5, 1, 20, '2', S("abcde22222222222222222222"));
return true;
}
template <class S>
TEST_CONSTEXPR_CXX20 void test1()
TEST_CONSTEXPR_CXX20 bool test1()
{
test(S("abcde"), 6, 0, 0, '2', S("can't happen"));
test(S("abcde"), 6, 0, 5, '2', S("can't happen"));
@@ -261,10 +265,12 @@ TEST_CONSTEXPR_CXX20 void test1()
test(S("abcdefghij"), 11, 0, 5, '2', S("can't happen"));
test(S("abcdefghij"), 11, 0, 10, '2', S("can't happen"));
test(S("abcdefghij"), 11, 0, 20, '2', S("can't happen"));
return true;
}
template <class S>
TEST_CONSTEXPR_CXX20 void test2()
TEST_CONSTEXPR_CXX20 bool test2()
{
test(S("abcdefghijklmnopqrst"), 0, 0, 0, '2', S("abcdefghijklmnopqrst"));
test(S("abcdefghijklmnopqrst"), 0, 0, 5, '2', S("22222abcdefghijklmnopqrst"));
@@ -362,32 +368,28 @@ TEST_CONSTEXPR_CXX20 void test2()
test(S("abcdefghijklmnopqrst"), 21, 0, 5, '2', S("can't happen"));
test(S("abcdefghijklmnopqrst"), 21, 0, 10, '2', S("can't happen"));
test(S("abcdefghijklmnopqrst"), 21, 0, 20, '2', S("can't happen"));
return true;
}
bool test() {
{
typedef std::string S;
test0<S>();
test1<S>();
test2<S>();
}
#if TEST_STD_VER >= 11
{
typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
test0<S>();
test1<S>();
test2<S>();
}
#endif
template <class S>
void test() {
test0<S>();
test1<S>();
test2<S>();
return true;
#if TEST_STD_VER > 17
static_assert(test0<S>());
static_assert(test1<S>());
static_assert(test2<S>());
#endif
}
int main(int, char**)
{
test();
#if TEST_STD_VER > 17
// static_assert(test());
test<std::string>();
#if TEST_STD_VER >= 11
test<std::basic_string<char, std::char_traits<char>, min_allocator<char>>>();
#endif
return 0;
@@ -6,10 +6,12 @@
//
//===----------------------------------------------------------------------===//
// XFAIL: LIBCXX-AIX-FIXME
// <string>
// basic_string<charT,traits,Allocator>&
// replace(size_type pos1, size_type n1, const basic_string<charT,traits,Allocator>& str);
// replace(size_type pos1, size_type n1, const basic_string<charT,traits,Allocator>& str); // constexpr since C++20
#include <string>
#include <stdexcept>
@@ -35,7 +37,7 @@ test(S s, typename S::size_type pos1, typename S::size_type n1, S str, S expecte
assert(s.size() == old_size - xlen + rlen);
}
#ifndef TEST_HAS_NO_EXCEPTIONS
else
else if (!TEST_IS_CONSTANT_EVALUATED)
{
try
{
@@ -52,7 +54,7 @@ test(S s, typename S::size_type pos1, typename S::size_type n1, S str, S expecte
}
template <class S>
TEST_CONSTEXPR_CXX20 void test0()
TEST_CONSTEXPR_CXX20 bool test0()
{
test(S(""), 0, 0, S(""), S(""));
test(S(""), 0, 0, S("12345"), S("12345"));
@@ -154,10 +156,12 @@ TEST_CONSTEXPR_CXX20 void test0()
test(S("abcde"), 5, 1, S("12345"), S("abcde12345"));
test(S("abcde"), 5, 1, S("1234567890"), S("abcde1234567890"));
test(S("abcde"), 5, 1, S("12345678901234567890"), S("abcde12345678901234567890"));
return true;
}
template <class S>
TEST_CONSTEXPR_CXX20 void test1()
TEST_CONSTEXPR_CXX20 bool test1()
{
test(S("abcde"), 6, 0, S(""), S("can't happen"));
test(S("abcde"), 6, 0, S("12345"), S("can't happen"));
@@ -259,10 +263,12 @@ TEST_CONSTEXPR_CXX20 void test1()
test(S("abcdefghij"), 11, 0, S("12345"), S("can't happen"));
test(S("abcdefghij"), 11, 0, S("1234567890"), S("can't happen"));
test(S("abcdefghij"), 11, 0, S("12345678901234567890"), S("can't happen"));
return true;
}
template <class S>
TEST_CONSTEXPR_CXX20 void test2()
TEST_CONSTEXPR_CXX20 bool test2()
{
test(S("abcdefghijklmnopqrst"), 0, 0, S(""), S("abcdefghijklmnopqrst"));
test(S("abcdefghijklmnopqrst"), 0, 0, S("12345"), S("12345abcdefghijklmnopqrst"));
@@ -360,23 +366,22 @@ TEST_CONSTEXPR_CXX20 void test2()
test(S("abcdefghijklmnopqrst"), 21, 0, S("12345"), S("can't happen"));
test(S("abcdefghijklmnopqrst"), 21, 0, S("1234567890"), S("can't happen"));
test(S("abcdefghijklmnopqrst"), 21, 0, S("12345678901234567890"), S("can't happen"));
return true;
}
bool test() {
template <class S>
void test() {
{
typedef std::string S;
test0<S>();
test1<S>();
test2<S>();
}
#if TEST_STD_VER >= 11
{
typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
test0<S>();
test1<S>();
test2<S>();
}
#if TEST_STD_VER > 17
static_assert(test0<S>());
static_assert(test1<S>());
static_assert(test2<S>());
#endif
}
#if TEST_STD_VER > 3
{ // LWG 2946
@@ -386,16 +391,13 @@ bool test() {
assert(s == "a");
}
#endif
return true;
}
int main(int, char**)
{
test();
#if TEST_STD_VER > 17
// static_assert(test());
test<std::string>();
#if TEST_STD_VER >= 11
test<std::basic_string<char, std::char_traits<char>, min_allocator<char>>>();
#endif
return 0;
}
@@ -6,11 +6,13 @@
//
//===----------------------------------------------------------------------===//
// XFAIL: LIBCXX-AIX-FIXME
// <string>
// basic_string<charT,traits,Allocator>&
// replace(size_type pos1, size_type n1, const basic_string<charT,traits,Allocator>& str,
// size_type pos2, size_type n2=npos);
// size_type pos2, size_type n2=npos); // constexpr since C++20
// the "=npos" was added in C++14
#include <string>
@@ -39,7 +41,7 @@ test(S s, typename S::size_type pos1, typename S::size_type n1,
assert(s.size() == old_size - xlen + rlen);
}
#ifndef TEST_HAS_NO_EXCEPTIONS
else
else if (!TEST_IS_CONSTANT_EVALUATED)
{
try
{
@@ -73,7 +75,7 @@ test_npos(S s, typename S::size_type pos1, typename S::size_type n1,
assert(s.size() == old_size - xlen + rlen);
}
#ifndef TEST_HAS_NO_EXCEPTIONS
else
else if (!TEST_IS_CONSTANT_EVALUATED)
{
try
{
@@ -6031,62 +6033,62 @@ void test() {
test55<S>();
#if TEST_STD_VER > 17
// static_assert(test0<S>());
// static_assert(test1<S>());
// static_assert(test2<S>());
// static_assert(test3<S>());
// static_assert(test4<S>());
// static_assert(test5<S>());
// static_assert(test6<S>());
// static_assert(test7<S>());
// static_assert(test8<S>());
// static_assert(test9<S>());
// static_assert(test10<S>());
// static_assert(test11<S>());
// static_assert(test12<S>());
// static_assert(test13<S>());
// static_assert(test14<S>());
// static_assert(test15<S>());
// static_assert(test16<S>());
// static_assert(test17<S>());
// static_assert(test18<S>());
// static_assert(test19<S>());
// static_assert(test20<S>());
// static_assert(test21<S>());
// static_assert(test22<S>());
// static_assert(test23<S>());
// static_assert(test24<S>());
// static_assert(test25<S>());
// static_assert(test26<S>());
// static_assert(test27<S>());
// static_assert(test28<S>());
// static_assert(test29<S>());
// static_assert(test30<S>());
// static_assert(test31<S>());
// static_assert(test32<S>());
// static_assert(test33<S>());
// static_assert(test34<S>());
// static_assert(test35<S>());
// static_assert(test36<S>());
// static_assert(test37<S>());
// static_assert(test38<S>());
// static_assert(test39<S>());
// static_assert(test40<S>());
// static_assert(test41<S>());
// static_assert(test42<S>());
// static_assert(test43<S>());
// static_assert(test44<S>());
// static_assert(test45<S>());
// static_assert(test46<S>());
// static_assert(test47<S>());
// static_assert(test48<S>());
// static_assert(test49<S>());
// static_assert(test50<S>());
// static_assert(test51<S>());
// static_assert(test52<S>());
// static_assert(test53<S>());
// static_assert(test54<S>());
// static_assert(test55<S>());
static_assert(test0<S>());
static_assert(test1<S>());
static_assert(test2<S>());
static_assert(test3<S>());
static_assert(test4<S>());
static_assert(test5<S>());
static_assert(test6<S>());
static_assert(test7<S>());
static_assert(test8<S>());
static_assert(test9<S>());
static_assert(test10<S>());
static_assert(test11<S>());
static_assert(test12<S>());
static_assert(test13<S>());
static_assert(test14<S>());
static_assert(test15<S>());
static_assert(test16<S>());
static_assert(test17<S>());
static_assert(test18<S>());
static_assert(test19<S>());
static_assert(test20<S>());
static_assert(test21<S>());
static_assert(test22<S>());
static_assert(test23<S>());
static_assert(test24<S>());
static_assert(test25<S>());
static_assert(test26<S>());
static_assert(test27<S>());
static_assert(test28<S>());
static_assert(test29<S>());
static_assert(test30<S>());
static_assert(test31<S>());
static_assert(test32<S>());
static_assert(test33<S>());
static_assert(test34<S>());
static_assert(test35<S>());
static_assert(test36<S>());
static_assert(test37<S>());
static_assert(test38<S>());
static_assert(test39<S>());
static_assert(test40<S>());
static_assert(test41<S>());
static_assert(test42<S>());
static_assert(test43<S>());
static_assert(test44<S>());
static_assert(test45<S>());
static_assert(test46<S>());
static_assert(test47<S>());
static_assert(test48<S>());
static_assert(test49<S>());
static_assert(test50<S>());
static_assert(test51<S>());
static_assert(test52<S>());
static_assert(test53<S>());
static_assert(test54<S>());
static_assert(test55<S>());
#endif
}
@@ -6,10 +6,12 @@
//
//===----------------------------------------------------------------------===//
// XFAIL: LIBCXX-AIX-FIXME
// <string>
// basic_string<charT,traits,Allocator>&
// replace(size_type pos1, size_type n1, basic_string_view<charT,traits> sv);
// replace(size_type pos1, size_type n1, basic_string_view<charT,traits> sv); // constexpr since C++20
#include <string>
#include <stdexcept>
@@ -35,7 +37,7 @@ test(S s, typename S::size_type pos1, typename S::size_type n1, SV sv, S expecte
assert(s.size() == old_size - xlen + rlen);
}
#ifndef TEST_HAS_NO_EXCEPTIONS
else
else if (!TEST_IS_CONSTANT_EVALUATED)
{
try
{
@@ -52,7 +54,7 @@ test(S s, typename S::size_type pos1, typename S::size_type n1, SV sv, S expecte
}
template <class S, class SV>
TEST_CONSTEXPR_CXX20 void test0()
TEST_CONSTEXPR_CXX20 bool test0()
{
test(S(""), 0, 0, SV(""), S(""));
test(S(""), 0, 0, SV("12345"), S("12345"));
@@ -154,10 +156,12 @@ TEST_CONSTEXPR_CXX20 void test0()
test(S("abcde"), 5, 1, SV("12345"), S("abcde12345"));
test(S("abcde"), 5, 1, SV("1234567890"), S("abcde1234567890"));
test(S("abcde"), 5, 1, SV("12345678901234567890"), S("abcde12345678901234567890"));
return true;
}
template <class S, class SV>
TEST_CONSTEXPR_CXX20 void test1()
TEST_CONSTEXPR_CXX20 bool test1()
{
test(S("abcde"), 6, 0, SV(""), S("can't happen"));
test(S("abcde"), 6, 0, SV("12345"), S("can't happen"));
@@ -259,10 +263,12 @@ TEST_CONSTEXPR_CXX20 void test1()
test(S("abcdefghij"), 11, 0, SV("12345"), S("can't happen"));
test(S("abcdefghij"), 11, 0, SV("1234567890"), S("can't happen"));
test(S("abcdefghij"), 11, 0, SV("12345678901234567890"), S("can't happen"));
return true;
}
template <class S, class SV>
TEST_CONSTEXPR_CXX20 void test2()
TEST_CONSTEXPR_CXX20 bool test2()
{
test(S("abcdefghijklmnopqrst"), 0, 0, SV(""), S("abcdefghijklmnopqrst"));
test(S("abcdefghijklmnopqrst"), 0, 0, SV("12345"), S("12345abcdefghijklmnopqrst"));
@@ -360,34 +366,30 @@ TEST_CONSTEXPR_CXX20 void test2()
test(S("abcdefghijklmnopqrst"), 21, 0, SV("12345"), S("can't happen"));
test(S("abcdefghijklmnopqrst"), 21, 0, SV("1234567890"), S("can't happen"));
test(S("abcdefghijklmnopqrst"), 21, 0, SV("12345678901234567890"), S("can't happen"));
return true;
}
bool test() {
template <class S>
void test() {
{
typedef std::string S;
typedef std::string_view SV;
test0<S, SV>();
test1<S, SV>();
test2<S, SV>();
}
#if TEST_STD_VER >= 11
{
typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
typedef std::string_view SV;
test0<S, SV>();
test1<S, SV>();
test2<S, SV>();
}
#if TEST_STD_VER > 17
static_assert(test0<S, SV>());
static_assert(test1<S, SV>());
static_assert(test2<S, SV>());
#endif
return true;
}
}
int main(int, char**)
{
test();
#if TEST_STD_VER > 17
// static_assert(test());
test<std::string>();
#if TEST_STD_VER >= 11
test<std::basic_string<char, std::char_traits<char>, min_allocator<char>>>();
#endif
return 0;