From 14098cf6c0a448520a70196a06de589abd9eee25 Mon Sep 17 00:00:00 2001 From: Arthur O'Dwyer Date: Fri, 4 Dec 2020 13:47:12 -0500 Subject: [PATCH] [libc++] [P0202] constexpr set_union, set_difference, set_symmetric_difference, merge These had been waiting on the ability to use `std::copy` from constexpr code (which in turn had been waiting on the ability to use `is_constant_evaluated()` to switch between `memmove` and non-`memmove` implementations of `std::copy`). That work landed a while ago, so these algorithms can all be constexpr in C++20 now. Simultaneously, update the tests for the set algorithms. - Use an element type with "equivalent but not identical" values. - The custom-comparator tests now pass something different from `operator<`. - Make the constexpr coverage match the non-constexpr coverage. Differential Revision: https://reviews.llvm.org/D92255 --- libcxx/docs/Cxx2aStatus.rst | 1 - libcxx/docs/Cxx2aStatusPaperStatus.csv | 2 +- libcxx/include/algorithm | 34 +-- .../alg.sorting/alg.merge/merge.pass.cpp | 272 +++++-------------- .../alg.sorting/alg.merge/merge_comp.pass.cpp | 289 +++++---------------- .../set.difference/set_difference.pass.cpp | 233 +++++------------ .../set.difference/set_difference_comp.pass.cpp | 234 +++++------------ .../set.intersection/set_intersection.pass.cpp | 243 +++++------------ .../set_intersection_comp.pass.cpp | 245 +++++------------ .../set_symmetric_difference.pass.cpp | 234 +++++------------ .../set_symmetric_difference_comp.pass.cpp | 237 +++++------------ .../set.union/set_union.pass.cpp | 235 +++++------------ .../set.union/set_union_comp.pass.cpp | 232 +++++------------ .../std/algorithms/alg.sorting/sortable_helpers.h | 78 ++++++ 14 files changed, 730 insertions(+), 1839 deletions(-) create mode 100644 libcxx/test/std/algorithms/alg.sorting/sortable_helpers.h diff --git a/libcxx/docs/Cxx2aStatus.rst b/libcxx/docs/Cxx2aStatus.rst index af65a1f..4e4bcd5 100644 --- a/libcxx/docs/Cxx2aStatus.rst +++ b/libcxx/docs/Cxx2aStatus.rst @@ -40,7 +40,6 @@ Paper Status .. note:: - .. [#note-P0202] P0202: The missing bits in P0202 are in ``copy`` and ``copy_backwards`` (and the ones that call them: ``copy_n``, ``set_union``, ``set_difference``, and ``set_symmetric_difference``). This is because the first two algorithms have specializations that call ``memmove`` which is not constexpr. See `Bug 25165 `__ .. [#note-P0600] P0600: The missing bits in P0600 are in |sect|\ [mem.res.class], |sect|\ [mem.poly.allocator.class], and |sect|\ [container.node.overview]. .. [#note-P0966] P0966: It was previously erroneously marked as complete in version 8.0. See `bug 45368 `__. diff --git a/libcxx/docs/Cxx2aStatusPaperStatus.csv b/libcxx/docs/Cxx2aStatusPaperStatus.csv index ac2c093c..3e02732 100644 --- a/libcxx/docs/Cxx2aStatusPaperStatus.csv +++ b/libcxx/docs/Cxx2aStatusPaperStatus.csv @@ -4,7 +4,7 @@ "","","","","","" "`P0020R6 `__","LWG","Floating Point Atomic","Albuquerque","","" "`P0053R7 `__","LWG","C++ Synchronized Buffered Ostream","Albuquerque","","" -"`P0202R3 `__","LWG","Add constexpr modifiers to functions in and Headers","Albuquerque","|In Progress| [#note-P0202]_","7.0" +"`P0202R3 `__","LWG","Add constexpr modifiers to functions in and Headers","Albuquerque","|Complete|","12.0" "`P0415R1 `__","LWG","Constexpr for ``std::complex``\ ","Albuquerque","|In Progress|","7.0" "`P0439R0 `__","LWG","Make ``std::memory_order``\ a scoped enumeration","Albuquerque","|Complete|","" "`P0457R2 `__","LWG","String Prefix and Suffix Checking","Albuquerque","|Complete|","6.0" diff --git a/libcxx/include/algorithm b/libcxx/include/algorithm index 2a854e7..7ad8ff9 100644 --- a/libcxx/include/algorithm +++ b/libcxx/include/algorithm @@ -415,12 +415,12 @@ template binary_search(ForwardIterator first, ForwardIterator last, const T& value, Compare comp); template - OutputIterator + constexpr OutputIterator // constexpr in C++20 merge(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result); template - OutputIterator + constexpr OutputIterator // constexpr in C++20 merge(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); @@ -441,12 +441,12 @@ template includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp); template - OutputIterator + constexpr OutputIterator // constexpr in C++20 set_union(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result); template - OutputIterator + constexpr OutputIterator // constexpr in C++20 set_union(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); @@ -461,22 +461,22 @@ template - OutputIterator + constexpr OutputIterator // constexpr in C++20 set_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result); template - OutputIterator + constexpr OutputIterator // constexpr in C++20 set_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); template - OutputIterator + constexpr OutputIterator // constexpr in C++20 set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result); template - OutputIterator + constexpr OutputIterator // constexpr in C++20 set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); @@ -5401,7 +5401,7 @@ includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __fi // set_union template -_OutputIterator +_LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator __set_union(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp) { @@ -5426,7 +5426,7 @@ __set_union(_InputIterator1 __first1, _InputIterator1 __last1, } template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator set_union(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp) @@ -5436,7 +5436,7 @@ set_union(_InputIterator1 __first1, _InputIterator1 __last1, } template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator set_union(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result) @@ -5495,7 +5495,7 @@ set_intersection(_InputIterator1 __first1, _InputIterator1 __last1, // set_difference template -_OutputIterator +_LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator __set_difference(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp) { @@ -5520,7 +5520,7 @@ __set_difference(_InputIterator1 __first1, _InputIterator1 __last1, } template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator set_difference(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp) @@ -5530,7 +5530,7 @@ set_difference(_InputIterator1 __first1, _InputIterator1 __last1, } template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator set_difference(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result) @@ -5543,7 +5543,7 @@ set_difference(_InputIterator1 __first1, _InputIterator1 __last1, // set_symmetric_difference template -_OutputIterator +_LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator __set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp) { @@ -5573,7 +5573,7 @@ __set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1, } template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp) @@ -5583,7 +5583,7 @@ set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1, } template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result) diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.merge/merge.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.merge/merge.pass.cpp index 5e8e998c8..83b88d9 100644 --- a/libcxx/test/std/algorithms/alg.sorting/alg.merge/merge.pass.cpp +++ b/libcxx/test/std/algorithms/alg.sorting/alg.merge/merge.pass.cpp @@ -5,12 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// -// -// REQUIRES: long_tests -// Older compilers don't support std::is_constant_evaluated -// UNSUPPORTED: clang-4, clang-5, clang-6, clang-7, clang-8 -// UNSUPPORTED: apple-clang-9, apple-clang-10 +// UNSUPPORTED: clang-8 // @@ -18,233 +14,85 @@ // requires OutputIterator // && OutputIterator // && HasLess +// && HasLess // constexpr OutIter // constexpr after C++17 -// merge(InIter1 first1, InIter1 last1, InIter2 first2, InIter2 last2, OutIter result); +// merge(InIter1 first1, InIter1 last1, InIter2 first2, InIter2 last2, +// OutIter result); #include -#include #include #include "test_macros.h" #include "test_iterators.h" +#include "../sortable_helpers.h" -#if TEST_STD_VER > 17 -TEST_CONSTEXPR bool test_constexpr() { - int ia[] = {0, 1, 2, 3, 4}; - int ib[] = {2, 4, 6, 8}; - int ic[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - const int expected[] = {0, 1, 2, 2, 3, 4, 4, 6, 8}; - - auto it = std::merge(std::begin(ia), std::end(ia), std::begin(ib), - std::end(ib), std::begin(ic)); - assert(std::distance(std::begin(ic), it) == static_cast(std::size(ia) + std::size(ib))); - assert(*it == 0); - assert(std::equal(std::begin(ic), it, std::begin(expected), std::end(expected))); - return true; -} -#endif - -std::mt19937 randomness; - -template -void test() { +template +TEST_CONSTEXPR_CXX20 void test4() +{ + const T a[] = {11, 33, 31, 41}; + const T b[] = {22, 32, 43, 42, 52}; { - unsigned N = 100000; - int* ia = new int[N]; - int* ib = new int[N]; - int* ic = new int[2*N]; - for (unsigned i = 0; i < N; ++i) - ia[i] = 2*i; - for (unsigned i = 0; i < N; ++i) - ib[i] = 2*i+1; - OutIter r = std::merge(InIter1(ia), InIter1(ia+N), - InIter2(ib), InIter2(ib+N), OutIter(ic)); - assert(base(r) == ic+2*N); - assert(ic[0] == 0); - assert(ic[2*N-1] == static_cast(2*N-1)); - assert(std::is_sorted(ic, ic+2*N)); - delete [] ic; - delete [] ib; - delete [] ia; + T result[20] = {}; + T expected[] = {11, 22, 33, 31, 32, 41, 43, 42, 52}; + OutIter end = std::merge(Iter1(a), Iter1(a+4), Iter2(b), Iter2(b+5), OutIter(result)); + assert(std::lexicographical_compare(result, base(end), expected, expected+9, T::less) == 0); + for (const T *it = base(end); it != result+20; ++it) { + assert(it->value == 0); + } } { - unsigned N = 100; - int* ia = new int[N]; - int* ib = new int[N]; - int* ic = new int[2*N]; - for (unsigned i = 0; i < 2*N; ++i) - ic[i] = i; - std::shuffle(ic, ic+2*N, randomness); - std::copy(ic, ic+N, ia); - std::copy(ic+N, ic+2*N, ib); - std::sort(ia, ia+N); - std::sort(ib, ib+N); - OutIter r = std::merge(InIter1(ia), InIter1(ia+N), - InIter2(ib), InIter2(ib+N), OutIter(ic)); - assert(base(r) == ic+2*N); - assert(ic[0] == 0); - assert(ic[2*N-1] == static_cast(2*N-1)); - assert(std::is_sorted(ic, ic+2*N)); - delete [] ic; - delete [] ib; - delete [] ia; + T result[20] = {}; + T expected[] = {11, 22, 32, 33, 31, 43, 42, 41, 52}; + OutIter end = std::merge(Iter1(b), Iter1(b+5), Iter2(a), Iter2(a+4), OutIter(result)); + assert(std::lexicographical_compare(result, base(end), expected, expected+9, T::less) == 0); + for (const T *it = base(end); it != result+20; ++it) { + assert(it->value == 0); + } } } -int main(int, char**) +template +TEST_CONSTEXPR_CXX20 void test3() { - test, input_iterator, output_iterator >(); - test, input_iterator, forward_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, input_iterator, output_iterator >(); - test, input_iterator, forward_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, input_iterator, output_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, input_iterator, output_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, output_iterator >(); - test, bidirectional_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); - - test, output_iterator >(); - test, forward_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); + test4 >(); + test4 >(); + test4 >(); + test4 >(); + test4(); +} - test, output_iterator >(); - test, forward_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); +template +TEST_CONSTEXPR_CXX20 void test2() +{ + test3 >(); + test3 >(); + test3 >(); + test3 >(); + test3(); +} - test, output_iterator >(); - test, forward_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); +template +TEST_CONSTEXPR_CXX20 void test1() +{ + test2 >(); + test2 >(); + test2 >(); + test2 >(); + test2(); +} - test >(); - test >(); - test >(); - test >(); - test(); +TEST_CONSTEXPR_CXX20 bool test() +{ + test1(); + test1(); + return true; +} +int main(int, char**) +{ + test(); #if TEST_STD_VER > 17 - static_assert(test_constexpr()); + static_assert(test()); #endif return 0; diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.merge/merge_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.merge/merge_comp.pass.cpp index 63fe392..1383986 100644 --- a/libcxx/test/std/algorithms/alg.sorting/alg.merge/merge_comp.pass.cpp +++ b/libcxx/test/std/algorithms/alg.sorting/alg.merge/merge_comp.pass.cpp @@ -5,261 +5,96 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// -// -// REQUIRES: long_tests -// Older compilers don't support std::is_constant_evaluated -// UNSUPPORTED: clang-4, clang-5, clang-6, clang-7, clang-8 -// UNSUPPORTED: apple-clang-9, apple-clang-10 +// UNSUPPORTED: clang-8 // // template Compare> +// CopyConstructible Compare> // requires OutputIterator // && OutputIterator -// && CopyConstructible +// && Predicate +// && Predicate // constexpr OutIter // constexpr after C++17 -// merge(InIter1 first1, InIter1 last1, -// InIter2 first2, InIter2 last2, OutIter result, Compare comp); +// merge(InIter1 first1, InIter1 last1, InIter2 first2, InIter2 last2, +// OutIter result, Compare comp); #include -#include -#include #include #include "test_macros.h" #include "test_iterators.h" -#include "counting_predicates.h" - -#if TEST_STD_VER > 17 -TEST_CONSTEXPR bool test_constexpr() { - int ia[] = {0, 1, 2, 3, 4}; - int ib[] = {2, 4, 6, 8}; - int ic[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - const int expected[] = {0, 1, 2, 2, 3, 4, 4, 6, 8}; - - auto it = - std::merge(std::begin(ia), std::end(ia), std::begin(ib), std::end(ib), - std::begin(ic), std::less<>{}); - assert(std::distance(std::begin(ic), it) == static_cast(std::size(ia) + std::size(ib))); - assert(*it == 0); - assert( - std::equal(std::begin(ic), it, std::begin(expected), std::end(expected))); - return true; -} -#endif - -std::mt19937 randomness; +#include "../sortable_helpers.h" -template -void -test() +template +TEST_CONSTEXPR_CXX20 void test4() { + const T a[] = {11, 33, 31, 41}; + const T b[] = {22, 32, 43, 42, 52}; { - unsigned N = 100000; - int* ia = new int[N]; - int* ib = new int[N]; - int* ic = new int[2*N]; - for (unsigned i = 0; i < N; ++i) - ia[i] = 2*i; - for (unsigned i = 0; i < N; ++i) - ib[i] = 2*i+1; - std::reverse(ia, ia+N); - std::reverse(ib, ib+N); - binary_counting_predicate, int, int> pred((std::greater())); - OutIter r = std::merge(InIter1(ia), InIter1(ia+N), - InIter2(ib), InIter2(ib+N), OutIter(ic), pred); - assert(base(r) == ic+2*N); - assert(ic[0] == static_cast(2*N-1)); - assert(ic[2*N-1] == 0); - assert(std::is_sorted(ic, ic+2*N, std::greater())); - assert(pred.count() <= (N + N - 1)); - delete [] ic; - delete [] ib; - delete [] ia; + T result[20] = {}; + T expected[] = {11, 22, 33, 31, 32, 41, 43, 42, 52}; + OutIter end = std::merge(Iter1(a), Iter1(a+4), Iter2(b), Iter2(b+5), OutIter(result), typename T::Comparator()); + assert(std::lexicographical_compare(result, base(end), expected, expected+9, T::less) == 0); + for (const T *it = base(end); it != result+20; ++it) { + assert(it->value == 0); + } } { - unsigned N = 100; - int* ia = new int[N]; - int* ib = new int[N]; - int* ic = new int[2*N]; - for (unsigned i = 0; i < 2*N; ++i) - ic[i] = i; - std::shuffle(ic, ic+2*N, randomness); - std::copy(ic, ic+N, ia); - std::copy(ic+N, ic+2*N, ib); - std::sort(ia, ia+N, std::greater()); - std::sort(ib, ib+N, std::greater()); - binary_counting_predicate, int, int> pred((std::greater())); - OutIter r = std::merge(InIter1(ia), InIter1(ia+N), - InIter2(ib), InIter2(ib+N), OutIter(ic), pred); - assert(base(r) == ic+2*N); - assert(ic[0] == static_cast(2*N-1)); - assert(ic[2*N-1] == 0); - assert(std::is_sorted(ic, ic+2*N, std::greater())); - assert(pred.count() <= (N + N - 1)); - delete [] ic; - delete [] ib; - delete [] ia; + T result[20] = {}; + T expected[] = {11, 22, 32, 33, 31, 43, 42, 41, 52}; + OutIter end = std::merge(Iter1(b), Iter1(b+5), Iter2(a), Iter2(a+4), OutIter(result), typename T::Comparator()); + assert(std::lexicographical_compare(result, base(end), expected, expected+9, T::less) == 0); + for (const T *it = base(end); it != result+20; ++it) { + assert(it->value == 0); + } } } -int main(int, char**) +template +TEST_CONSTEXPR_CXX20 void test3() { - test, input_iterator, output_iterator >(); - test, input_iterator, forward_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, input_iterator, output_iterator >(); - test, input_iterator, forward_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, input_iterator, output_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, input_iterator, output_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, output_iterator >(); - test, bidirectional_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); - - test, output_iterator >(); - test, forward_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); + test4 >(); + test4 >(); + test4 >(); + test4 >(); + test4(); +} - test, output_iterator >(); - test, forward_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); +template +TEST_CONSTEXPR_CXX20 void test2() +{ + test3 >(); + test3 >(); + test3 >(); + test3 >(); + test3(); +} - test, output_iterator >(); - test, forward_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); +template +TEST_CONSTEXPR_CXX20 void test1() +{ + test2 >(); + test2 >(); + test2 >(); + test2 >(); + test2(); +} - test >(); - test >(); - test >(); - test >(); - test(); +TEST_CONSTEXPR_CXX20 bool test() +{ + test1(); + test1(); + return true; +} +int main(int, char**) +{ + test(); #if TEST_STD_VER > 17 - static_assert(test_constexpr()); + static_assert(test()); #endif - return 0; + return 0; } diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.difference/set_difference.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.difference/set_difference.pass.cpp index ec1e671..7489290 100644 --- a/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.difference/set_difference.pass.cpp +++ b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.difference/set_difference.pass.cpp @@ -6,6 +6,8 @@ // //===----------------------------------------------------------------------===// +// UNSUPPORTED: clang-8 + // // template @@ -13,7 +15,7 @@ // && OutputIterator // && HasLess // && HasLess -// OutIter +// constexpr OutIter // constexpr after C++17 // set_difference(InIter1 first1, InIter1 last1, InIter2 first2, InIter2 last2, // OutIter result); @@ -22,181 +24,76 @@ #include "test_macros.h" #include "test_iterators.h" +#include "../../sortable_helpers.h" -template -void -test() +template +TEST_CONSTEXPR_CXX20 void test4() { - int ia[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4}; - const int sa = sizeof(ia)/sizeof(ia[0]); - int ib[] = {2, 4, 4, 6}; - const int sb = sizeof(ib)/sizeof(ib[0]); - int ic[20]; - int ir[] = {1, 2, 3, 3, 3, 4, 4}; - const int sr = sizeof(ir)/sizeof(ir[0]); - OutIter ce = std::set_difference(Iter1(ia), Iter1(ia+sa), - Iter2(ib), Iter2(ib+sb), OutIter(ic)); - assert(base(ce) - ic == sr); - assert(std::lexicographical_compare(ic, base(ce), ir, ir+sr) == 0); - int irr[] = {6}; - const int srr = sizeof(irr)/sizeof(irr[0]); - ce = std::set_difference(Iter1(ib), Iter1(ib+sb), - Iter2(ia), Iter2(ia+sa), OutIter(ic)); - assert(base(ce) - ic == srr); - assert(std::lexicographical_compare(ic, base(ce), irr, irr+srr) == 0); + const T a[] = {11, 33, 31, 41}; + const T b[] = {22, 32, 43, 42, 52}; + { + T result[20] = {}; + T expected[] = {11, 31}; + OutIter end = std::set_difference(Iter1(a), Iter1(a+4), Iter2(b), Iter2(b+5), OutIter(result)); + assert(std::lexicographical_compare(result, base(end), expected, expected+2, T::less) == 0); + for (const T *it = base(end); it != result+20; ++it) { + assert(it->value == 0); + } + } + { + T result[20] = {}; + T expected[] = {22, 42, 52}; + OutIter end = std::set_difference(Iter1(b), Iter1(b+5), Iter2(a), Iter2(a+4), OutIter(result)); + assert(std::lexicographical_compare(result, base(end), expected, expected+3, T::less) == 0); + for (const T *it = base(end); it != result+20; ++it) { + assert(it->value == 0); + } + } } -int main(int, char**) +template +TEST_CONSTEXPR_CXX20 void test3() { - test, input_iterator, output_iterator >(); - test, input_iterator, forward_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, input_iterator, output_iterator >(); - test, input_iterator, forward_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, input_iterator, output_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, input_iterator, output_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, output_iterator >(); - test, bidirectional_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); + test4 >(); + test4 >(); + test4 >(); + test4 >(); + test4(); +} - test, output_iterator >(); - test, forward_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); +template +TEST_CONSTEXPR_CXX20 void test2() +{ + test3 >(); + test3 >(); + test3 >(); + test3 >(); + test3(); +} - test, output_iterator >(); - test, forward_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); +template +TEST_CONSTEXPR_CXX20 void test1() +{ + test2 >(); + test2 >(); + test2 >(); + test2 >(); + test2(); +} - test, output_iterator >(); - test, forward_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); +TEST_CONSTEXPR_CXX20 bool test() +{ + test1(); + test1(); + return true; +} - test >(); - test >(); - test >(); - test >(); - test(); +int main(int, char**) +{ + test(); +#if TEST_STD_VER > 17 + static_assert(test()); +#endif - return 0; + return 0; } diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.difference/set_difference_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.difference/set_difference_comp.pass.cpp index 2ed7ca9..8ce8394 100644 --- a/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.difference/set_difference_comp.pass.cpp +++ b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.difference/set_difference_comp.pass.cpp @@ -6,6 +6,8 @@ // //===----------------------------------------------------------------------===// +// UNSUPPORTED: clang-8 + // // template // && Predicate // && Predicate -// OutIter +// constexpr OutIter // constexpr after C++17 // set_difference(InIter1 first1, InIter1 last1, InIter2 first2, InIter2 last2, // OutIter result, Compare comp); #include -#include #include #include "test_macros.h" #include "test_iterators.h" +#include "../../sortable_helpers.h" -template -void -test() +template +TEST_CONSTEXPR_CXX20 void test4() { - int ia[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4}; - const int sa = sizeof(ia)/sizeof(ia[0]); - int ib[] = {2, 4, 4, 6}; - const int sb = sizeof(ib)/sizeof(ib[0]); - int ic[20]; - int ir[] = {1, 2, 3, 3, 3, 4, 4}; - const int sr = sizeof(ir)/sizeof(ir[0]); - OutIter ce = std::set_difference(Iter1(ia), Iter1(ia+sa), - Iter2(ib), Iter2(ib+sb), OutIter(ic), std::less()); - assert(base(ce) - ic == sr); - assert(std::lexicographical_compare(ic, base(ce), ir, ir+sr) == 0); - int irr[] = {6}; - const int srr = sizeof(irr)/sizeof(irr[0]); - ce = std::set_difference(Iter1(ib), Iter1(ib+sb), - Iter2(ia), Iter2(ia+sa), OutIter(ic), std::less()); - assert(base(ce) - ic == srr); - assert(std::lexicographical_compare(ic, base(ce), irr, irr+srr) == 0); + const T a[] = {11, 33, 31, 41}; + const T b[] = {22, 32, 43, 42, 52}; + { + T result[20] = {}; + T expected[] = {11, 31}; + OutIter end = std::set_difference(Iter1(a), Iter1(a+4), Iter2(b), Iter2(b+5), OutIter(result), typename T::Comparator()); + assert(std::lexicographical_compare(result, base(end), expected, expected+2, T::less) == 0); + for (const T *it = base(end); it != result+20; ++it) { + assert(it->value == 0); + } + } + { + T result[20] = {}; + T expected[] = {22, 42, 52}; + OutIter end = std::set_difference(Iter1(b), Iter1(b+5), Iter2(a), Iter2(a+4), OutIter(result), typename T::Comparator()); + assert(std::lexicographical_compare(result, base(end), expected, expected+3, T::less) == 0); + for (const T *it = base(end); it != result+20; ++it) { + assert(it->value == 0); + } + } } -int main(int, char**) +template +TEST_CONSTEXPR_CXX20 void test3() { - test, input_iterator, output_iterator >(); - test, input_iterator, forward_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, input_iterator, output_iterator >(); - test, input_iterator, forward_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, input_iterator, output_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, input_iterator, output_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, output_iterator >(); - test, bidirectional_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); + test4 >(); + test4 >(); + test4 >(); + test4 >(); + test4(); +} - test, output_iterator >(); - test, forward_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); +template +TEST_CONSTEXPR_CXX20 void test2() +{ + test3 >(); + test3 >(); + test3 >(); + test3 >(); + test3(); +} - test, output_iterator >(); - test, forward_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); +template +TEST_CONSTEXPR_CXX20 void test1() +{ + test2 >(); + test2 >(); + test2 >(); + test2 >(); + test2(); +} - test, output_iterator >(); - test, forward_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); +TEST_CONSTEXPR_CXX20 bool test() +{ + test1(); + test1(); + return true; +} - test >(); - test >(); - test >(); - test >(); - test(); +int main(int, char**) +{ + test(); +#if TEST_STD_VER > 17 + static_assert(test()); +#endif - return 0; + return 0; } diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.intersection/set_intersection.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.intersection/set_intersection.pass.cpp index b90aaf7..ea86e22 100644 --- a/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.intersection/set_intersection.pass.cpp +++ b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.intersection/set_intersection.pass.cpp @@ -22,201 +22,76 @@ #include "test_macros.h" #include "test_iterators.h" +#include "../../sortable_helpers.h" -#if TEST_STD_VER > 17 -TEST_CONSTEXPR bool test_constexpr() { - const int ia[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4}; - const int ib[] = {2, 4, 4, 6}; - int results[std::size(ia)] = {0}; - - auto it = std::set_intersection(std::begin(ia), std::end(ia), - std::begin(ib), std::end(ib), std::begin(results)); - - return std::includes(std::begin(ia), std::end(ia), std::begin(results), it) - && std::includes(std::begin(ib), std::end(ib), std::begin(results), it) - && std::is_sorted(std::begin(results), it) - && std::all_of(it, std::end(results), [](int a) {return a == 0; }) - ; +template +TEST_CONSTEXPR_CXX20 void test4() +{ + const T a[] = {11, 33, 31, 41}; + const T b[] = {22, 32, 43, 42, 52}; + { + T result[20] = {}; + T expected[] = {33, 41}; + OutIter end = std::set_intersection(Iter1(a), Iter1(a+4), Iter2(b), Iter2(b+5), OutIter(result)); + assert(std::lexicographical_compare(result, base(end), expected, expected+2, T::less) == 0); + for (const T *it = base(end); it != result+20; ++it) { + assert(it->value == 0); + } } -#endif - + { + T result[20] = {}; + T expected[] = {32, 42}; + OutIter end = std::set_intersection(Iter1(b), Iter1(b+5), Iter2(a), Iter2(a+4), OutIter(result)); + assert(std::lexicographical_compare(result, base(end), expected, expected+2, T::less) == 0); + for (const T *it = base(end); it != result+20; ++it) { + assert(it->value == 0); + } + } +} -template -void -test() +template +TEST_CONSTEXPR_CXX20 void test3() { - int ia[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4}; - const int sa = sizeof(ia)/sizeof(ia[0]); - int ib[] = {2, 4, 4, 6}; - const int sb = sizeof(ib)/sizeof(ib[0]); - int ic[20]; - int ir[] = {2, 4, 4}; - const int sr = sizeof(ir)/sizeof(ir[0]); - OutIter ce = std::set_intersection(Iter1(ia), Iter1(ia+sa), - Iter2(ib), Iter2(ib+sb), OutIter(ic)); - assert(base(ce) - ic == sr); - assert(std::lexicographical_compare(ic, base(ce), ir, ir+sr) == 0); - ce = std::set_intersection(Iter1(ib), Iter1(ib+sb), - Iter2(ia), Iter2(ia+sa), OutIter(ic)); - assert(base(ce) - ic == sr); - assert(std::lexicographical_compare(ic, base(ce), ir, ir+sr) == 0); + test4 >(); + test4 >(); + test4 >(); + test4 >(); + test4(); } -int main(int, char**) +template +TEST_CONSTEXPR_CXX20 void test2() { - test, input_iterator, output_iterator >(); - test, input_iterator, forward_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, input_iterator, output_iterator >(); - test, input_iterator, forward_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, input_iterator, output_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, input_iterator, output_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, output_iterator >(); - test, bidirectional_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); - - test, output_iterator >(); - test, forward_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); - - test, output_iterator >(); - test, forward_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); + test3 >(); + test3 >(); + test3 >(); + test3 >(); + test3(); +} - test, output_iterator >(); - test, forward_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); +template +TEST_CONSTEXPR_CXX20 void test1() +{ + test2 >(); + test2 >(); + test2 >(); + test2 >(); + test2(); +} - test >(); - test >(); - test >(); - test >(); - test(); +TEST_CONSTEXPR_CXX20 bool test() +{ + test1(); + test1(); + return true; +} +int main(int, char**) +{ + test(); #if TEST_STD_VER > 17 - static_assert(test_constexpr()); + static_assert(test()); #endif - return 0; + return 0; } diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.intersection/set_intersection_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.intersection/set_intersection_comp.pass.cpp index b1796df..0ac88f6 100644 --- a/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.intersection/set_intersection_comp.pass.cpp +++ b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.intersection/set_intersection_comp.pass.cpp @@ -19,207 +19,80 @@ // OutIter result, Compare comp); #include -#include #include #include "test_macros.h" #include "test_iterators.h" +#include "../../sortable_helpers.h" -#if TEST_STD_VER > 17 -TEST_CONSTEXPR bool test_constexpr() { - const int ia[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4}; - const int ib[] = {2, 4, 4, 6}; - int results[std::size(ia)] = {0}; - - auto comp = [](int a, int b) {return a < b; }; - auto it = std::set_intersection(std::begin(ia), std::end(ia), - std::begin(ib), std::end(ib), std::begin(results), comp); - - return std::includes(std::begin(ia), std::end(ia), std::begin(results), it) - && std::includes(std::begin(ib), std::end(ib), std::begin(results), it) - && std::is_sorted(std::begin(results), it, comp) - && std::all_of(it, std::end(results), [](int a) {return a == 0; }) - ; +template +TEST_CONSTEXPR_CXX20 void test4() +{ + const T a[] = {11, 33, 31, 41}; + const T b[] = {22, 32, 43, 42, 52}; + { + T result[20] = {}; + T expected[] = {33, 41}; + OutIter end = std::set_intersection(Iter1(a), Iter1(a+4), Iter2(b), Iter2(b+5), OutIter(result), typename T::Comparator()); + assert(std::lexicographical_compare(result, base(end), expected, expected+2, T::less) == 0); + for (const T *it = base(end); it != result+20; ++it) { + assert(it->value == 0); + } } -#endif - + { + T result[20] = {}; + T expected[] = {32, 42}; + OutIter end = std::set_intersection(Iter1(b), Iter1(b+5), Iter2(a), Iter2(a+4), OutIter(result), typename T::Comparator()); + assert(std::lexicographical_compare(result, base(end), expected, expected+2, T::less) == 0); + for (const T *it = base(end); it != result+20; ++it) { + assert(it->value == 0); + } + } +} -template -void -test() +template +TEST_CONSTEXPR_CXX20 void test3() { - int ia[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4}; - const int sa = sizeof(ia)/sizeof(ia[0]); - int ib[] = {2, 4, 4, 6}; - const int sb = sizeof(ib)/sizeof(ib[0]); - int ic[20]; - int ir[] = {2, 4, 4}; - const int sr = sizeof(ir)/sizeof(ir[0]); - OutIter ce = std::set_intersection(Iter1(ia), Iter1(ia+sa), - Iter2(ib), Iter2(ib+sb), OutIter(ic), std::less()); - assert(base(ce) - ic == sr); - assert(std::lexicographical_compare(ic, base(ce), ir, ir+sr) == 0); - ce = std::set_intersection(Iter1(ib), Iter1(ib+sb), - Iter2(ia), Iter2(ia+sa), OutIter(ic), std::less()); - assert(base(ce) - ic == sr); - assert(std::lexicographical_compare(ic, base(ce), ir, ir+sr) == 0); + test4 >(); + test4 >(); + test4 >(); + test4 >(); + test4(); } -int main(int, char**) +template +TEST_CONSTEXPR_CXX20 void test2() { - test, input_iterator, output_iterator >(); - test, input_iterator, forward_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, input_iterator, output_iterator >(); - test, input_iterator, forward_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, input_iterator, output_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, input_iterator, output_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, output_iterator >(); - test, bidirectional_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); - - test, output_iterator >(); - test, forward_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); - - test, output_iterator >(); - test, forward_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); + test3 >(); + test3 >(); + test3 >(); + test3 >(); + test3(); +} - test, output_iterator >(); - test, forward_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); +template +TEST_CONSTEXPR_CXX20 void test1() +{ + test2 >(); + test2 >(); + test2 >(); + test2 >(); + test2(); +} - test >(); - test >(); - test >(); - test >(); - test(); +TEST_CONSTEXPR_CXX20 bool test() +{ + test1(); + test1(); + return true; +} +int main(int, char**) +{ + test(); #if TEST_STD_VER > 17 - static_assert(test_constexpr()); + static_assert(test()); #endif - return 0; + return 0; } diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.symmetric.difference/set_symmetric_difference.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.symmetric.difference/set_symmetric_difference.pass.cpp index f8965df..9df46af 100644 --- a/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.symmetric.difference/set_symmetric_difference.pass.cpp +++ b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.symmetric.difference/set_symmetric_difference.pass.cpp @@ -6,6 +6,8 @@ // //===----------------------------------------------------------------------===// +// UNSUPPORTED: clang-8 + // // template @@ -13,9 +15,8 @@ // && OutputIterator // && HasLess // && HasLess -// OutIter -// set_symmetric_difference(InIter1 first1, InIter1 last1, -// InIter2 first2, InIter2 last2, +// constexpr OutIter // constexpr after C++17 +// set_symmetric_difference(InIter1 first1, InIter1 last1, InIter2 first2, InIter2 last2, // OutIter result); #include @@ -23,179 +24,76 @@ #include "test_macros.h" #include "test_iterators.h" +#include "../../sortable_helpers.h" -template -void -test() +template +TEST_CONSTEXPR_CXX20 void test4() { - int ia[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4}; - const int sa = sizeof(ia)/sizeof(ia[0]); - int ib[] = {2, 4, 4, 6}; - const int sb = sizeof(ib)/sizeof(ib[0]); - int ic[20]; - int ir[] = {1, 2, 3, 3, 3, 4, 4, 6}; - const int sr = sizeof(ir)/sizeof(ir[0]); - OutIter ce = std::set_symmetric_difference(Iter1(ia), Iter1(ia+sa), - Iter2(ib), Iter2(ib+sb), OutIter(ic)); - assert(base(ce) - ic == sr); - assert(std::lexicographical_compare(ic, base(ce), ir, ir+sr) == 0); - ce = std::set_symmetric_difference(Iter1(ib), Iter1(ib+sb), - Iter2(ia), Iter2(ia+sa), OutIter(ic)); - assert(base(ce) - ic == sr); - assert(std::lexicographical_compare(ic, base(ce), ir, ir+sr) == 0); + const T a[] = {11, 33, 31, 41}; + const T b[] = {22, 32, 43, 42, 52}; + { + T result[20] = {}; + T expected[] = {11, 22, 31, 42, 52}; + OutIter end = std::set_symmetric_difference(Iter1(a), Iter1(a+4), Iter2(b), Iter2(b+5), OutIter(result)); + assert(std::lexicographical_compare(result, base(end), expected, expected+5, T::less) == 0); + for (const T *it = base(end); it != result+20; ++it) { + assert(it->value == 0); + } + } + { + T result[20] = {}; + T expected[] = {11, 22, 31, 42, 52}; + OutIter end = std::set_symmetric_difference(Iter1(b), Iter1(b+5), Iter2(a), Iter2(a+4), OutIter(result)); + assert(std::lexicographical_compare(result, base(end), expected, expected+5, T::less) == 0); + for (const T *it = base(end); it != result+20; ++it) { + assert(it->value == 0); + } + } } -int main(int, char**) +template +TEST_CONSTEXPR_CXX20 void test3() { - test, input_iterator, output_iterator >(); - test, input_iterator, forward_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, input_iterator, output_iterator >(); - test, input_iterator, forward_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, input_iterator, output_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, input_iterator, output_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, output_iterator >(); - test, bidirectional_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); + test4 >(); + test4 >(); + test4 >(); + test4 >(); + test4(); +} - test, output_iterator >(); - test, forward_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); +template +TEST_CONSTEXPR_CXX20 void test2() +{ + test3 >(); + test3 >(); + test3 >(); + test3 >(); + test3(); +} - test, output_iterator >(); - test, forward_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); +template +TEST_CONSTEXPR_CXX20 void test1() +{ + test2 >(); + test2 >(); + test2 >(); + test2 >(); + test2(); +} - test, output_iterator >(); - test, forward_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); +TEST_CONSTEXPR_CXX20 bool test() +{ + test1(); + test1(); + return true; +} - test >(); - test >(); - test >(); - test >(); - test(); +int main(int, char**) +{ + test(); +#if TEST_STD_VER > 17 + static_assert(test()); +#endif - return 0; + return 0; } diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.symmetric.difference/set_symmetric_difference_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.symmetric.difference/set_symmetric_difference_comp.pass.cpp index 5e67074..f947d18 100644 --- a/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.symmetric.difference/set_symmetric_difference_comp.pass.cpp +++ b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.symmetric.difference/set_symmetric_difference_comp.pass.cpp @@ -6,6 +6,8 @@ // //===----------------------------------------------------------------------===// +// UNSUPPORTED: clang-8 + // // template // && Predicate // && Predicate -// OutIter -// set_symmetric_difference(InIter1 first1, InIter1 last1, -// InIter2 first2, InIter2 last2, +// constexpr OutIter // constexpr after C++17 +// set_symmetric_difference(InIter1 first1, InIter1 last1, InIter2 first2, InIter2 last2, // OutIter result, Compare comp); #include -#include #include #include "test_macros.h" #include "test_iterators.h" +#include "../../sortable_helpers.h" -template -void -test() +template +TEST_CONSTEXPR_CXX20 void test4() { - int ia[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4}; - const int sa = sizeof(ia)/sizeof(ia[0]); - int ib[] = {2, 4, 4, 6}; - const int sb = sizeof(ib)/sizeof(ib[0]); - int ic[20]; - int ir[] = {1, 2, 3, 3, 3, 4, 4, 6}; - const int sr = sizeof(ir)/sizeof(ir[0]); - OutIter ce = std::set_symmetric_difference(Iter1(ia), Iter1(ia+sa), - Iter2(ib), Iter2(ib+sb), - OutIter(ic), std::less()); - assert(base(ce) - ic == sr); - assert(std::lexicographical_compare(ic, base(ce), ir, ir+sr) == 0); - ce = std::set_symmetric_difference(Iter1(ib), Iter1(ib+sb), - Iter2(ia), Iter2(ia+sa), - OutIter(ic), std::less()); - assert(base(ce) - ic == sr); - assert(std::lexicographical_compare(ic, base(ce), ir, ir+sr) == 0); + const T a[] = {11, 33, 31, 41}; + const T b[] = {22, 32, 43, 42, 52}; + { + T result[20] = {}; + T expected[] = {11, 22, 31, 42, 52}; + OutIter end = std::set_symmetric_difference(Iter1(a), Iter1(a+4), Iter2(b), Iter2(b+5), OutIter(result), typename T::Comparator()); + assert(std::lexicographical_compare(result, base(end), expected, expected+5, T::less) == 0); + for (const T *it = base(end); it != result+20; ++it) { + assert(it->value == 0); + } + } + { + T result[20] = {}; + T expected[] = {11, 22, 31, 42, 52}; + OutIter end = std::set_symmetric_difference(Iter1(b), Iter1(b+5), Iter2(a), Iter2(a+4), OutIter(result), typename T::Comparator()); + assert(std::lexicographical_compare(result, base(end), expected, expected+5, T::less) == 0); + for (const T *it = base(end); it != result+20; ++it) { + assert(it->value == 0); + } + } } -int main(int, char**) +template +TEST_CONSTEXPR_CXX20 void test3() { - test, input_iterator, output_iterator >(); - test, input_iterator, forward_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, input_iterator, output_iterator >(); - test, input_iterator, forward_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, input_iterator, output_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, input_iterator, output_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, output_iterator >(); - test, bidirectional_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); + test4 >(); + test4 >(); + test4 >(); + test4 >(); + test4(); +} - test, output_iterator >(); - test, forward_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); +template +TEST_CONSTEXPR_CXX20 void test2() +{ + test3 >(); + test3 >(); + test3 >(); + test3 >(); + test3(); +} - test, output_iterator >(); - test, forward_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); +template +TEST_CONSTEXPR_CXX20 void test1() +{ + test2 >(); + test2 >(); + test2 >(); + test2 >(); + test2(); +} - test, output_iterator >(); - test, forward_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); +TEST_CONSTEXPR_CXX20 bool test() +{ + test1(); + test1(); + return true; +} - test >(); - test >(); - test >(); - test >(); - test(); +int main(int, char**) +{ + test(); +#if TEST_STD_VER > 17 + static_assert(test()); +#endif - return 0; + return 0; } diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.union/set_union.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.union/set_union.pass.cpp index a4196ca..e8f6963 100644 --- a/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.union/set_union.pass.cpp +++ b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.union/set_union.pass.cpp @@ -6,6 +6,8 @@ // //===----------------------------------------------------------------------===// +// UNSUPPORTED: clang-8 + // // template @@ -13,188 +15,85 @@ // && OutputIterator // && HasLess // && HasLess -// OutIter -// set_union(InIter1 first1, InIter1 last1, -// InIter2 first2, InIter2 last2, OutIter result); +// constexpr OutIter // constexpr after C++17 +// set_union(InIter1 first1, InIter1 last1, InIter2 first2, InIter2 last2, +// OutIter result); #include #include #include "test_macros.h" #include "test_iterators.h" +#include "../../sortable_helpers.h" -template -void -test() +template +TEST_CONSTEXPR_CXX20 void test4() { - int ia[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4}; - const int sa = sizeof(ia)/sizeof(ia[0]); - int ib[] = {2, 4, 4, 6}; - const int sb = sizeof(ib)/sizeof(ib[0]); - int ic[20]; - int ir[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 6}; - const int sr = sizeof(ir)/sizeof(ir[0]); - OutIter ce = std::set_union(Iter1(ia), Iter1(ia+sa), - Iter2(ib), Iter2(ib+sb), OutIter(ic)); - assert(base(ce) - ic == sr); - assert(std::lexicographical_compare(ic, base(ce), ir, ir+sr) == 0); - ce = std::set_union(Iter1(ib), Iter1(ib+sb), - Iter2(ia), Iter2(ia+sa), OutIter(ic)); - assert(base(ce) - ic == sr); - assert(std::lexicographical_compare(ic, base(ce), ir, ir+sr) == 0); + const T a[] = {11, 33, 31, 41}; + const T b[] = {22, 32, 43, 42, 52}; + { + T result[20] = {}; + T expected[] = {11, 22, 33, 31, 41, 42, 52}; + OutIter end = std::set_union(Iter1(a), Iter1(a+4), Iter2(b), Iter2(b+5), OutIter(result)); + assert(std::lexicographical_compare(result, base(end), expected, expected+7, T::less) == 0); + for (const T *it = base(end); it != result+20; ++it) { + assert(it->value == 0); + } + } + { + T result[20] = {}; + T expected[] = {11, 22, 32, 31, 43, 42, 52}; + OutIter end = std::set_union(Iter1(b), Iter1(b+5), Iter2(a), Iter2(a+4), OutIter(result)); + assert(std::lexicographical_compare(result, base(end), expected, expected+7, T::less) == 0); + for (const T *it = base(end); it != result+20; ++it) { + assert(it->value == 0); + } + } } -int main(int, char**) +template +TEST_CONSTEXPR_CXX20 void test3() { - test, input_iterator, output_iterator >(); - test, input_iterator, forward_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, input_iterator, output_iterator >(); - test, input_iterator, forward_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, input_iterator, output_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, input_iterator, output_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, output_iterator >(); - test, bidirectional_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); + test4 >(); + test4 >(); + test4 >(); + test4 >(); + test4(); +} - test, output_iterator >(); - test, forward_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); +template +TEST_CONSTEXPR_CXX20 void test2() +{ + test3 >(); + test3 >(); + test3 >(); + test3 >(); + test3(); +} - test, output_iterator >(); - test, forward_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); +template +TEST_CONSTEXPR_CXX20 void test1() +{ + test2 >(); + test2 >(); + test2 >(); + test2 >(); + test2(); +} - test, output_iterator >(); - test, forward_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); +TEST_CONSTEXPR_CXX20 bool test() +{ + test1(); + test1(); + return true; +} - test >(); - test >(); - test >(); - test >(); - test(); +int main(int, char**) +{ + test(); +#if TEST_STD_VER > 17 + static_assert(test()); +#endif - return 0; + return 0; } diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.union/set_union_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.union/set_union_comp.pass.cpp index aa4828b..07ec934 100644 --- a/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.union/set_union_comp.pass.cpp +++ b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.union/set_union_comp.pass.cpp @@ -6,6 +6,8 @@ // //===----------------------------------------------------------------------===// +// UNSUPPORTED: clang-8 + // // template // && Predicate // && Predicate -// OutIter +// constexpr OutIter // constexpr after C++17 // set_union(InIter1 first1, InIter1 last1, InIter2 first2, InIter2 last2, // OutIter result, Compare comp); #include -#include #include #include "test_macros.h" #include "test_iterators.h" +#include "../../sortable_helpers.h" -template -void -test() +template +TEST_CONSTEXPR_CXX20 void test4() { - int ia[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4}; - const int sa = sizeof(ia)/sizeof(ia[0]); - int ib[] = {2, 4, 4, 6}; - const int sb = sizeof(ib)/sizeof(ib[0]); - int ic[20]; - int ir[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 6}; - const int sr = sizeof(ir)/sizeof(ir[0]); - OutIter ce = std::set_union(Iter1(ia), Iter1(ia+sa), - Iter2(ib), Iter2(ib+sb), OutIter(ic), std::less()); - assert(base(ce) - ic == sr); - assert(std::lexicographical_compare(ic, base(ce), ir, ir+sr) == 0); - ce = std::set_union(Iter1(ib), Iter1(ib+sb), - Iter2(ia), Iter2(ia+sa), OutIter(ic), std::less()); - assert(base(ce) - ic == sr); - assert(std::lexicographical_compare(ic, base(ce), ir, ir+sr) == 0); + const T a[] = {11, 33, 31, 41}; + const T b[] = {22, 32, 43, 42, 52}; + { + T result[20] = {}; + T expected[] = {11, 22, 33, 31, 41, 42, 52}; + OutIter end = std::set_union(Iter1(a), Iter1(a+4), Iter2(b), Iter2(b+5), OutIter(result), typename T::Comparator()); + assert(std::lexicographical_compare(result, base(end), expected, expected+7, T::less) == 0); + for (const T *it = base(end); it != result+20; ++it) { + assert(it->value == 0); + } + } + { + T result[20] = {}; + T expected[] = {11, 22, 32, 31, 43, 42, 52}; + OutIter end = std::set_union(Iter1(b), Iter1(b+5), Iter2(a), Iter2(a+4), OutIter(result), typename T::Comparator()); + assert(std::lexicographical_compare(result, base(end), expected, expected+7, T::less) == 0); + for (const T *it = base(end); it != result+20; ++it) { + assert(it->value == 0); + } + } } -int main(int, char**) +template +TEST_CONSTEXPR_CXX20 void test3() { - test, input_iterator, output_iterator >(); - test, input_iterator, forward_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, input_iterator, output_iterator >(); - test, input_iterator, forward_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, input_iterator, output_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, input_iterator, output_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, bidirectional_iterator >(); - test, input_iterator, random_access_iterator >(); - test, input_iterator, int*>(); - - test, forward_iterator, output_iterator >(); - test, forward_iterator, forward_iterator >(); - test, forward_iterator, bidirectional_iterator >(); - test, forward_iterator, random_access_iterator >(); - test, forward_iterator, int*>(); - - test, bidirectional_iterator, output_iterator >(); - test, bidirectional_iterator, forward_iterator >(); - test, bidirectional_iterator, bidirectional_iterator >(); - test, bidirectional_iterator, random_access_iterator >(); - test, bidirectional_iterator, int*>(); - - test, random_access_iterator, output_iterator >(); - test, random_access_iterator, forward_iterator >(); - test, random_access_iterator, bidirectional_iterator >(); - test, random_access_iterator, random_access_iterator >(); - test, random_access_iterator, int*>(); - - test, const int*, output_iterator >(); - test, const int*, forward_iterator >(); - test, const int*, bidirectional_iterator >(); - test, const int*, random_access_iterator >(); - test, const int*, int*>(); - - test, output_iterator >(); - test, bidirectional_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); + test4 >(); + test4 >(); + test4 >(); + test4 >(); + test4(); +} - test, output_iterator >(); - test, forward_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); +template +TEST_CONSTEXPR_CXX20 void test2() +{ + test3 >(); + test3 >(); + test3 >(); + test3 >(); + test3(); +} - test, output_iterator >(); - test, forward_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); +template +TEST_CONSTEXPR_CXX20 void test1() +{ + test2 >(); + test2 >(); + test2 >(); + test2 >(); + test2(); +} - test, output_iterator >(); - test, forward_iterator >(); - test, bidirectional_iterator >(); - test, random_access_iterator >(); - test, int*>(); +TEST_CONSTEXPR_CXX20 bool test() +{ + test1(); + test1(); + return true; +} - test >(); - test >(); - test >(); - test >(); - test(); +int main(int, char**) +{ + test(); +#if TEST_STD_VER > 17 + static_assert(test()); +#endif - return 0; + return 0; } diff --git a/libcxx/test/std/algorithms/alg.sorting/sortable_helpers.h b/libcxx/test/std/algorithms/alg.sorting/sortable_helpers.h new file mode 100644 index 0000000..a5c138e --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/sortable_helpers.h @@ -0,0 +1,78 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef SORTABLE_HELPERS_H +#define SORTABLE_HELPERS_H + +#include + +#include "test_macros.h" + +struct TrivialSortable { + int value; + TEST_CONSTEXPR TrivialSortable() : value(0) {} + TEST_CONSTEXPR TrivialSortable(int v) : value(v) {} + friend TEST_CONSTEXPR bool operator<(const TrivialSortable& a, const TrivialSortable& b) { + return a.value / 10 < b.value / 10; + } + static TEST_CONSTEXPR bool less(const TrivialSortable& a, const TrivialSortable& b) { + return a.value < b.value; + } +}; + +struct NonTrivialSortable { + int value; + TEST_CONSTEXPR NonTrivialSortable() : value(0) {} + TEST_CONSTEXPR NonTrivialSortable(int v) : value(v) {} + TEST_CONSTEXPR NonTrivialSortable(const NonTrivialSortable& rhs) : value(rhs.value) {} + TEST_CONSTEXPR_CXX14 NonTrivialSortable& operator=(const NonTrivialSortable& rhs) { value = rhs.value; return *this; } + friend TEST_CONSTEXPR bool operator<(const NonTrivialSortable& a, const NonTrivialSortable& b) { + return a.value / 10 < b.value / 10; + } + static TEST_CONSTEXPR bool less(const NonTrivialSortable& a, const NonTrivialSortable& b) { + return a.value < b.value; + } +}; + + +struct TrivialSortableWithComp { + int value; + TEST_CONSTEXPR TrivialSortableWithComp() : value(0) {} + TEST_CONSTEXPR TrivialSortableWithComp(int v) : value(v) {} + struct Comparator { + TEST_CONSTEXPR bool operator()(const TrivialSortableWithComp& a, const TrivialSortableWithComp& b) const { + return a.value / 10 < b.value / 10; + } + }; + static TEST_CONSTEXPR bool less(const TrivialSortableWithComp& a, const TrivialSortableWithComp& b) { + return a.value < b.value; + } +}; + +struct NonTrivialSortableWithComp { + int value; + TEST_CONSTEXPR NonTrivialSortableWithComp() : value(0) {} + TEST_CONSTEXPR NonTrivialSortableWithComp(int v) : value(v) {} + TEST_CONSTEXPR NonTrivialSortableWithComp(const NonTrivialSortableWithComp& rhs) : value(rhs.value) {} + TEST_CONSTEXPR_CXX14 NonTrivialSortableWithComp& operator=(const NonTrivialSortableWithComp& rhs) { value = rhs.value; return *this; } + struct Comparator { + TEST_CONSTEXPR bool operator()(const NonTrivialSortableWithComp& a, const NonTrivialSortableWithComp& b) const { + return a.value / 10 < b.value / 10; + } + }; + static TEST_CONSTEXPR bool less(const NonTrivialSortableWithComp& a, const NonTrivialSortableWithComp& b) { + return a.value < b.value; + } +}; + +static_assert(std::is_trivially_copyable::value, ""); +static_assert(std::is_trivially_copyable::value, ""); +static_assert(!std::is_trivially_copyable::value, ""); +static_assert(!std::is_trivially_copyable::value, ""); + +#endif // SORTABLE_HELPERS_H -- 2.7.4