diff --git a/libcxx/test/std/strings/basic.string/string.capacity/reserve_size.pass.cpp b/libcxx/test/std/strings/basic.string/string.capacity/reserve_size.pass.cpp --- a/libcxx/test/std/strings/basic.string/string.capacity/reserve_size.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.capacity/reserve_size.pass.cpp @@ -23,7 +23,7 @@ #include "min_allocator.h" template -void +TEST_CONSTEXPR_CXX20 void test(typename S::size_type min_cap, typename S::size_type erased_index, typename S::size_type res_arg) { S s(min_cap, 'a'); @@ -47,7 +47,7 @@ #endif } #ifndef TEST_HAS_NO_EXCEPTIONS - else + else if (!TEST_IS_CONSTANT_EVALUATED) { try { diff --git a/libcxx/test/std/strings/basic.string/string.capacity/resize_size.pass.cpp b/libcxx/test/std/strings/basic.string/string.capacity/resize_size.pass.cpp --- a/libcxx/test/std/strings/basic.string/string.capacity/resize_size.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.capacity/resize_size.pass.cpp @@ -28,7 +28,7 @@ assert(s == expected); } #ifndef TEST_HAS_NO_EXCEPTIONS - else + else if (!TEST_IS_CONSTANT_EVALUATED) { try { diff --git a/libcxx/test/std/strings/basic.string/string.capacity/resize_size_char.pass.cpp b/libcxx/test/std/strings/basic.string/string.capacity/resize_size_char.pass.cpp --- a/libcxx/test/std/strings/basic.string/string.capacity/resize_size_char.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.capacity/resize_size_char.pass.cpp @@ -18,7 +18,7 @@ #include "min_allocator.h" template -void +TEST_CONSTEXPR_CXX20 void test(S s, typename S::size_type n, typename S::value_type c, S expected) { if (n <= s.max_size()) @@ -28,7 +28,7 @@ assert(s == expected); } #ifndef TEST_HAS_NO_EXCEPTIONS - else + else if (!TEST_IS_CONSTANT_EVALUATED) { try { diff --git a/libcxx/test/std/strings/basic.string/string.capacity/shrink_to_fit.pass.cpp b/libcxx/test/std/strings/basic.string/string.capacity/shrink_to_fit.pass.cpp --- a/libcxx/test/std/strings/basic.string/string.capacity/shrink_to_fit.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.capacity/shrink_to_fit.pass.cpp @@ -17,7 +17,7 @@ #include "min_allocator.h" template -void +TEST_CONSTEXPR_CXX20 void test(S s) { typename S::size_type old_cap = s.capacity(); @@ -30,7 +30,7 @@ } bool test() { - { + { typedef std::string S; S s; test(s); @@ -42,9 +42,9 @@ s.assign(100, 'a'); s.erase(50); test(s); - } + } #if TEST_STD_VER >= 11 - { + { typedef std::basic_string, min_allocator> S; S s; test(s); @@ -56,7 +56,7 @@ s.assign(100, 'a'); s.erase(50); test(s); - } + } #endif return true; diff --git a/libcxx/test/std/strings/basic.string/string.cons/T_size_size.pass.cpp b/libcxx/test/std/strings/basic.string/string.cons/T_size_size.pass.cpp --- a/libcxx/test/std/strings/basic.string/string.cons/T_size_size.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.cons/T_size_size.pass.cpp @@ -43,7 +43,7 @@ assert(s2.capacity() >= s2.size()); } #ifndef TEST_HAS_NO_EXCEPTIONS - else + else if (!TEST_IS_CONSTANT_EVALUATED) { try { @@ -76,7 +76,7 @@ assert(s2.capacity() >= s2.size()); } #ifndef TEST_HAS_NO_EXCEPTIONS - else + else if (!TEST_IS_CONSTANT_EVALUATED) { try { diff --git a/libcxx/test/std/strings/basic.string/string.cons/char_assignment.pass.cpp b/libcxx/test/std/strings/basic.string/string.cons/char_assignment.pass.cpp --- a/libcxx/test/std/strings/basic.string/string.cons/char_assignment.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.cons/char_assignment.pass.cpp @@ -17,7 +17,7 @@ #include "min_allocator.h" template -void +TEST_CONSTEXPR_CXX20 void test(S s1, typename S::value_type s2) { typedef typename S::traits_type T; diff --git a/libcxx/test/std/strings/basic.string/string.cons/copy.pass.cpp b/libcxx/test/std/strings/basic.string/string.cons/copy.pass.cpp --- a/libcxx/test/std/strings/basic.string/string.cons/copy.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.cons/copy.pass.cpp @@ -18,7 +18,7 @@ #include "min_allocator.h" template -void +TEST_CONSTEXPR_CXX20 void test(S s1) { S s2 = s1; diff --git a/libcxx/test/std/strings/basic.string/string.cons/copy_alloc.pass.cpp b/libcxx/test/std/strings/basic.string/string.cons/copy_alloc.pass.cpp --- a/libcxx/test/std/strings/basic.string/string.cons/copy_alloc.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.cons/copy_alloc.pass.cpp @@ -21,7 +21,7 @@ struct alloc_imp { bool active; - alloc_imp() : active(true) {} + TEST_CONSTEXPR alloc_imp() : active(true) {} template T* allocate(std::size_t n) @@ -45,10 +45,10 @@ alloc_imp *imp; - poca_alloc(alloc_imp *imp_) : imp (imp_) {} + TEST_CONSTEXPR poca_alloc(alloc_imp *imp_) : imp (imp_) {} template - poca_alloc(const poca_alloc& other) : imp(other.imp) {} + TEST_CONSTEXPR poca_alloc(const poca_alloc& other) : imp(other.imp) {} T* allocate (std::size_t n) { return imp->allocate(n);} void deallocate(T* p, std::size_t n) { imp->deallocate(p, n); } @@ -67,7 +67,7 @@ } template -void test_assign(S &s1, const S& s2) +TEST_CONSTEXPR_CXX20 void test_assign(S &s1, const S& s2) { try { s1 = s2; } catch ( std::bad_alloc &) { return; } @@ -78,7 +78,7 @@ template -void +TEST_CONSTEXPR_CXX20 void test(S s1, const typename S::allocator_type& a) { S s2(s1, a); @@ -106,7 +106,7 @@ } #ifndef TEST_HAS_NO_EXCEPTIONS - { + if (!TEST_IS_CONSTANT_EVALUATED) { typedef poca_alloc A; typedef std::basic_string, A> S; const char * p1 = "This is my first string"; diff --git a/libcxx/test/std/strings/basic.string/string.cons/string_view.pass.cpp b/libcxx/test/std/strings/basic.string/string.cons/string_view.pass.cpp --- a/libcxx/test/std/strings/basic.string/string.cons/string_view.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.cons/string_view.pass.cpp @@ -21,7 +21,7 @@ #include "min_allocator.h" template -void +TEST_CONSTEXPR_CXX20 void test(std::basic_string_view sv) { typedef std::basic_string, test_allocator > S; @@ -47,7 +47,7 @@ } template -void +TEST_CONSTEXPR_CXX20 void test(std::basic_string_view sv, const A& a) { typedef std::basic_string, A> S; diff --git a/libcxx/test/std/strings/basic.string/string.cons/substr.pass.cpp b/libcxx/test/std/strings/basic.string/string.cons/substr.pass.cpp --- a/libcxx/test/std/strings/basic.string/string.cons/substr.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.cons/substr.pass.cpp @@ -45,7 +45,7 @@ assert(s2.capacity() >= s2.size()); } #ifndef TEST_HAS_NO_EXCEPTIONS - else + else if (!TEST_IS_CONSTANT_EVALUATED) { try { @@ -77,7 +77,7 @@ assert(s2.capacity() >= s2.size()); } #ifndef TEST_HAS_NO_EXCEPTIONS - else + else if (!TEST_IS_CONSTANT_EVALUATED) { try { @@ -109,7 +109,7 @@ assert(s2.capacity() >= s2.size()); } #ifndef TEST_HAS_NO_EXCEPTIONS - else + else if (!TEST_IS_CONSTANT_EVALUATED) { try { @@ -124,11 +124,10 @@ #endif } -#if TEST_STD_VER >= 11 -#ifndef TEST_HAS_NO_EXCEPTIONS -void test2583() -{ // LWG #2583 - typedef std::basic_string, test_allocator > StringA; +void test_lwg2583() +{ +#if TEST_STD_VER >= 11 && !defined(TEST_HAS_NO_EXCEPTIONS) + typedef std::basic_string, test_allocator> StringA; std::vector>> vs; StringA s{"1234"}; vs.emplace_back(s, 2); @@ -136,9 +135,8 @@ try { vs.emplace_back(s, 5); } catch (const std::out_of_range&) { return; } assert(false); -} -#endif #endif +} bool test() { { @@ -218,10 +216,6 @@ test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 50, 10, A()); test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 50, 100, A()); } - -#ifndef TEST_HAS_NO_EXCEPTIONS - test2583(); -#endif #endif return true; @@ -233,6 +227,7 @@ #if TEST_STD_VER > 17 // static_assert(test()); #endif + test_lwg2583(); return 0; } diff --git a/libcxx/test/std/strings/basic.string/string.contains/contains.char.pass.cpp b/libcxx/test/std/strings/basic.string/string.contains/contains.char.pass.cpp --- a/libcxx/test/std/strings/basic.string/string.contains/contains.char.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.contains/contains.char.pass.cpp @@ -16,7 +16,7 @@ #include "test_macros.h" -void test() +bool test() { using S = std::string; @@ -31,6 +31,8 @@ assert( s2.contains('c')); assert( s2.contains('e')); assert(!s2.contains('x')); + + return true; } int main(int, char**) diff --git a/libcxx/test/std/strings/basic.string/string.contains/contains.ptr.pass.cpp b/libcxx/test/std/strings/basic.string/string.contains/contains.ptr.pass.cpp --- a/libcxx/test/std/strings/basic.string/string.contains/contains.ptr.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.contains/contains.ptr.pass.cpp @@ -16,7 +16,7 @@ #include "test_macros.h" -void test() +bool test() { using S = std::string; @@ -61,6 +61,8 @@ assert(!sNot.contains("abcde")); assert( sNot.contains("xyz")); assert(!sNot.contains("zyx")); + + return true; } int main(int, char**) diff --git a/libcxx/test/std/strings/basic.string/string.contains/contains.string_view.pass.cpp b/libcxx/test/std/strings/basic.string/string.contains/contains.string_view.pass.cpp --- a/libcxx/test/std/strings/basic.string/string.contains/contains.string_view.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.contains/contains.string_view.pass.cpp @@ -16,7 +16,7 @@ #include "test_macros.h" -void test() +bool test() { using S = std::string; using SV = std::string_view; @@ -82,6 +82,8 @@ assert( sNot.contains(svNot)); assert(!sNot.contains(svNot2)); assert(!sNot.contains(svNot3)); + + return true; } int main(int, char**) diff --git a/libcxx/test/std/strings/basic.string/string.iterators/cend.pass.cpp b/libcxx/test/std/strings/basic.string/string.iterators/cend.pass.cpp --- a/libcxx/test/std/strings/basic.string/string.iterators/cend.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.iterators/cend.pass.cpp @@ -17,7 +17,7 @@ #include "min_allocator.h" template -void +TEST_CONSTEXPR_CXX20 void test(const S& s) { typename S::const_iterator ce = s.cend(); diff --git a/libcxx/test/std/strings/basic.string/string.iterators/rend.pass.cpp b/libcxx/test/std/strings/basic.string/string.iterators/rend.pass.cpp --- a/libcxx/test/std/strings/basic.string/string.iterators/rend.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.iterators/rend.pass.cpp @@ -19,7 +19,7 @@ #include "min_allocator.h" template -void +TEST_CONSTEXPR_CXX20 void test(S s) { const S& cs = s; diff --git a/libcxx/test/std/strings/basic.string/string.modifiers/robust_against_adl.pass.cpp b/libcxx/test/std/strings/basic.string/string.modifiers/robust_against_adl.pass.cpp --- a/libcxx/test/std/strings/basic.string/string.modifiers/robust_against_adl.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.modifiers/robust_against_adl.pass.cpp @@ -19,8 +19,8 @@ template struct Charlike { char ch_; - Charlike(char ch) : ch_(ch) {} - operator char() const { return ch_; } + TEST_CONSTEXPR Charlike(char ch) : ch_(ch) {} + TEST_CONSTEXPR operator char() const { return ch_; } }; bool test() { diff --git a/libcxx/test/std/strings/basic.string/string.modifiers/string_append/T_size_size.pass.cpp b/libcxx/test/std/strings/basic.string/string.modifiers/string_append/T_size_size.pass.cpp --- a/libcxx/test/std/strings/basic.string/string.modifiers/string_append/T_size_size.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.modifiers/string_append/T_size_size.pass.cpp @@ -30,7 +30,7 @@ assert(s == expected); } #ifndef TEST_HAS_NO_EXCEPTIONS - else + else if (!TEST_IS_CONSTANT_EVALUATED) { try { @@ -56,7 +56,7 @@ assert(s == expected); } #ifndef TEST_HAS_NO_EXCEPTIONS - else + else if (!TEST_IS_CONSTANT_EVALUATED) { try { diff --git a/libcxx/test/std/strings/basic.string/string.modifiers/string_append/iterator.pass.cpp b/libcxx/test/std/strings/basic.string/string.modifiers/string_append/iterator.pass.cpp --- a/libcxx/test/std/strings/basic.string/string.modifiers/string_append/iterator.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.modifiers/string_append/iterator.pass.cpp @@ -172,7 +172,7 @@ } #endif #ifndef TEST_HAS_NO_EXCEPTIONS - { // test iterator operations that throw + if (!TEST_IS_CONSTANT_EVALUATED) { // test iterator operations that throw typedef std::string S; typedef ThrowingIterator TIter; typedef cpp17_input_iterator IIter; @@ -219,17 +219,20 @@ std::string s_short = "hello"; std::string s_long = "Lorem ipsum dolor sit amet, consectetur/"; std::string s_othertype = "hello"; - const unsigned char *first = reinterpret_cast(s_othertype.data()); std::string s_sneaky = "hello"; test(s_short, s_short.data() + s_short.size(), s_short.data() + s_short.size() + 1, std::string("hello\0", 6)); test(s_long, s_long.data() + s_long.size(), s_long.data() + s_long.size() + 1, std::string("Lorem ipsum dolor sit amet, consectetur/\0", 41)); - test(s_othertype, first + 2, first + 5, std::string("hellollo")); s_sneaky.reserve(12); test(s_sneaky, s_sneaky.data(), s_sneaky.data() + 6, std::string("hellohello\0", 11)); + + if (!TEST_IS_CONSTANT_EVALUATED) { + const unsigned char *first = reinterpret_cast(s_othertype.data()); + test(s_othertype, first + 2, first + 5, std::string("hellollo")); + } } { // test with a move iterator that returns char&& diff --git a/libcxx/test/std/strings/basic.string/string.modifiers/string_append/pointer.pass.cpp b/libcxx/test/std/strings/basic.string/string.modifiers/string_append/pointer.pass.cpp --- a/libcxx/test/std/strings/basic.string/string.modifiers/string_append/pointer.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.modifiers/string_append/pointer.pass.cpp @@ -18,7 +18,7 @@ #include "min_allocator.h" template -void +TEST_CONSTEXPR_CXX20 void test(S s, const typename S::value_type* str, S expected) { s.append(str); diff --git a/libcxx/test/std/strings/basic.string/string.modifiers/string_append/string_size_size.pass.cpp b/libcxx/test/std/strings/basic.string/string.modifiers/string_append/string_size_size.pass.cpp --- a/libcxx/test/std/strings/basic.string/string.modifiers/string_append/string_size_size.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.modifiers/string_append/string_size_size.pass.cpp @@ -30,7 +30,7 @@ assert(s == expected); } #ifndef TEST_HAS_NO_EXCEPTIONS - else + else if (!TEST_IS_CONSTANT_EVALUATED) { try { @@ -56,7 +56,7 @@ assert(s == expected); } #ifndef TEST_HAS_NO_EXCEPTIONS - else + else if (!TEST_IS_CONSTANT_EVALUATED) { try { diff --git a/libcxx/test/std/strings/basic.string/string.modifiers/string_assign/T_size_size.pass.cpp b/libcxx/test/std/strings/basic.string/string.modifiers/string_assign/T_size_size.pass.cpp --- a/libcxx/test/std/strings/basic.string/string.modifiers/string_assign/T_size_size.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.modifiers/string_assign/T_size_size.pass.cpp @@ -19,7 +19,7 @@ #include "min_allocator.h" template -void +TEST_CONSTEXPR_CXX20 void test(S s, SV sv, typename S::size_type pos, typename S::size_type n, S expected) { if (pos <= sv.size()) @@ -29,7 +29,7 @@ assert(s == expected); } #ifndef TEST_HAS_NO_EXCEPTIONS - else + else if (!TEST_IS_CONSTANT_EVALUATED) { try { @@ -45,7 +45,7 @@ } template -void +TEST_CONSTEXPR_CXX20 void test_npos(S s, SV sv, typename S::size_type pos, S expected) { if (pos <= sv.size()) @@ -55,7 +55,7 @@ assert(s == expected); } #ifndef TEST_HAS_NO_EXCEPTIONS - else + else if (!TEST_IS_CONSTANT_EVALUATED) { try { diff --git a/libcxx/test/std/strings/basic.string/string.modifiers/string_assign/iterator.pass.cpp b/libcxx/test/std/strings/basic.string/string.modifiers/string_assign/iterator.pass.cpp --- a/libcxx/test/std/strings/basic.string/string.modifiers/string_assign/iterator.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.modifiers/string_assign/iterator.pass.cpp @@ -19,7 +19,7 @@ #include "min_allocator.h" template -void +TEST_CONSTEXPR_CXX20 void test(S s, It first, It last, S expected) { s.assign(first, last); @@ -172,7 +172,7 @@ } #endif #ifndef TEST_HAS_NO_EXCEPTIONS - { // test iterator operations that throw + if (!TEST_IS_CONSTANT_EVALUATED) { // test iterator operations that throw typedef std::string S; typedef ThrowingIterator TIter; typedef cpp17_input_iterator IIter;