[llvm-branch-commits] [libcxx] 14098cf - [libc++] [P0202] constexpr set_union, set_difference, set_symmetric_difference, merge
Arthur O'Dwyer via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Fri Dec 4 14:58:48 PST 2020
Author: Arthur O'Dwyer
Date: 2020-12-04T17:53:54-05:00
New Revision: 14098cf6c0a448520a70196a06de589abd9eee25
URL: https://github.com/llvm/llvm-project/commit/14098cf6c0a448520a70196a06de589abd9eee25
DIFF: https://github.com/llvm/llvm-project/commit/14098cf6c0a448520a70196a06de589abd9eee25.diff
LOG: [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
Added:
libcxx/test/std/algorithms/alg.sorting/sortable_helpers.h
Modified:
libcxx/docs/Cxx2aStatus.rst
libcxx/docs/Cxx2aStatusPaperStatus.csv
libcxx/include/algorithm
libcxx/test/std/algorithms/alg.sorting/alg.merge/merge.pass.cpp
libcxx/test/std/algorithms/alg.sorting/alg.merge/merge_comp.pass.cpp
libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.difference/set_difference.pass.cpp
libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.difference/set_difference_comp.pass.cpp
libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.intersection/set_intersection.pass.cpp
libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.intersection/set_intersection_comp.pass.cpp
libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.symmetric.difference/set_symmetric_difference.pass.cpp
libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.symmetric.difference/set_symmetric_difference_comp.pass.cpp
libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.union/set_union.pass.cpp
libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.union/set_union_comp.pass.cpp
Removed:
################################################################################
diff --git a/libcxx/docs/Cxx2aStatus.rst b/libcxx/docs/Cxx2aStatus.rst
index af65a1fda16b..4e4bcd552c11 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_
diff erence``, and ``set_symmetric_
diff erence``). This is because the first two algorithms have specializations that call ``memmove`` which is not constexpr. See `Bug 25165 <https://bugs.llvm.org/show_bug.cgi?id=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 <https://llvm.org/PR45368>`__.
diff --git a/libcxx/docs/Cxx2aStatusPaperStatus.csv b/libcxx/docs/Cxx2aStatusPaperStatus.csv
index ac2c093cea3d..3e027327b6ae 100644
--- a/libcxx/docs/Cxx2aStatusPaperStatus.csv
+++ b/libcxx/docs/Cxx2aStatusPaperStatus.csv
@@ -4,7 +4,7 @@
"","","","","",""
"`P0020R6 <https://wg21.link/P0020R6>`__","LWG","Floating Point Atomic","Albuquerque","",""
"`P0053R7 <https://wg21.link/P0053R7>`__","LWG","C++ Synchronized Buffered Ostream","Albuquerque","",""
-"`P0202R3 <https://wg21.link/P0202R3>`__","LWG","Add constexpr modifiers to functions in <algorithm> and <utility> Headers","Albuquerque","|In Progress| [#note-P0202]_","7.0"
+"`P0202R3 <https://wg21.link/P0202R3>`__","LWG","Add constexpr modifiers to functions in <algorithm> and <utility> Headers","Albuquerque","|Complete|","12.0"
"`P0415R1 <https://wg21.link/P0415R1>`__","LWG","Constexpr for ``std::complex``\ ","Albuquerque","|In Progress|","7.0"
"`P0439R0 <https://wg21.link/P0439R0>`__","LWG","Make ``std::memory_order``\ a scoped enumeration","Albuquerque","|Complete|",""
"`P0457R2 <https://wg21.link/P0457R2>`__","LWG","String Prefix and Suffix Checking","Albuquerque","|Complete|","6.0"
diff --git a/libcxx/include/algorithm b/libcxx/include/algorithm
index 2a854e7da209..7ad8ff9a52a4 100644
--- a/libcxx/include/algorithm
+++ b/libcxx/include/algorithm
@@ -415,12 +415,12 @@ template <class ForwardIterator, class T, class Compare>
binary_search(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
template <class InputIterator1, class InputIterator2, class OutputIterator>
- OutputIterator
+ constexpr OutputIterator // constexpr in C++20
merge(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2, OutputIterator result);
template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
- 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 <class InputIterator1, class InputIterator2, class Compare>
includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp);
template <class InputIterator1, class InputIterator2, class OutputIterator>
- OutputIterator
+ constexpr OutputIterator // constexpr in C++20
set_union(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2, OutputIterator result);
template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
- 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 <class InputIterator1, class InputIterator2, class OutputIterator, clas
InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
template <class InputIterator1, class InputIterator2, class OutputIterator>
- OutputIterator
+ constexpr OutputIterator // constexpr in C++20
set_
diff erence(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2, OutputIterator result);
template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
- OutputIterator
+ constexpr OutputIterator // constexpr in C++20
set_
diff erence(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
template <class InputIterator1, class InputIterator2, class OutputIterator>
- OutputIterator
+ constexpr OutputIterator // constexpr in C++20
set_symmetric_
diff erence(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2, OutputIterator result);
template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
- OutputIterator
+ constexpr OutputIterator // constexpr in C++20
set_symmetric_
diff erence(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 <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
-_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 <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
-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 <class _InputIterator1, class _InputIterator2, class _OutputIterator>
-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_
diff erence
template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
-_OutputIterator
+_LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator
__set_
diff erence(_InputIterator1 __first1, _InputIterator1 __last1,
_InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
{
@@ -5520,7 +5520,7 @@ __set_
diff erence(_InputIterator1 __first1, _InputIterator1 __last1,
}
template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY
+inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
_OutputIterator
set_
diff erence(_InputIterator1 __first1, _InputIterator1 __last1,
_InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
@@ -5530,7 +5530,7 @@ set_
diff erence(_InputIterator1 __first1, _InputIterator1 __last1,
}
template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
-inline _LIBCPP_INLINE_VISIBILITY
+inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
_OutputIterator
set_
diff erence(_InputIterator1 __first1, _InputIterator1 __last1,
_InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
@@ -5543,7 +5543,7 @@ set_
diff erence(_InputIterator1 __first1, _InputIterator1 __last1,
// set_symmetric_
diff erence
template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
-_OutputIterator
+_LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator
__set_symmetric_
diff erence(_InputIterator1 __first1, _InputIterator1 __last1,
_InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
{
@@ -5573,7 +5573,7 @@ __set_symmetric_
diff erence(_InputIterator1 __first1, _InputIterator1 __last1,
}
template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY
+inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
_OutputIterator
set_symmetric_
diff erence(_InputIterator1 __first1, _InputIterator1 __last1,
_InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
@@ -5583,7 +5583,7 @@ set_symmetric_
diff erence(_InputIterator1 __first1, _InputIterator1 __last1,
}
template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
-inline _LIBCPP_INLINE_VISIBILITY
+inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
_OutputIterator
set_symmetric_
diff erence(_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 5e8e998c8703..83b88d911748 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
// <algorithm>
@@ -18,233 +14,85 @@
// requires OutputIterator<OutIter, InIter1::reference>
// && OutputIterator<OutIter, InIter2::reference>
// && HasLess<InIter2::value_type, InIter1::value_type>
+// && HasLess<InIter1::value_type, InIter2::value_type>
// 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 <algorithm>
-#include <random>
#include <cassert>
#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<int>(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 <class InIter1, class InIter2, class OutIter>
-void test() {
+template<class T, class Iter1, class Iter2, class OutIter>
+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<int>(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<int>(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<class T, class Iter1, class Iter2>
+TEST_CONSTEXPR_CXX20 void test3()
{
- test<input_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, const int*, output_iterator<int*> >();
- test<input_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<input_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<input_iterator<const int*>, const int*, int*>();
-
- test<forward_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, const int*, output_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, int*>();
-
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, const int*, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, int*>();
-
- test<random_access_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, const int*, output_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, int*>();
-
- test<const int*, input_iterator<const int*>, output_iterator<int*> >();
- test<const int*, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, input_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, input_iterator<const int*>, int*>();
-
- test<const int*, forward_iterator<const int*>, output_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, forward_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, int*>();
+ test4<T, Iter1, Iter2, output_iterator<T*> >();
+ test4<T, Iter1, Iter2, forward_iterator<T*> >();
+ test4<T, Iter1, Iter2, bidirectional_iterator<T*> >();
+ test4<T, Iter1, Iter2, random_access_iterator<T*> >();
+ test4<T, Iter1, Iter2, T*>();
+}
- test<const int*, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, int*>();
+template<class T, class Iter1>
+TEST_CONSTEXPR_CXX20 void test2()
+{
+ test3<T, Iter1, input_iterator<const T*> >();
+ test3<T, Iter1, forward_iterator<const T*> >();
+ test3<T, Iter1, bidirectional_iterator<const T*> >();
+ test3<T, Iter1, random_access_iterator<const T*> >();
+ test3<T, Iter1, const T*>();
+}
- test<const int*, random_access_iterator<const int*>, output_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, int*>();
+template<class T>
+TEST_CONSTEXPR_CXX20 void test1()
+{
+ test2<T, input_iterator<const T*> >();
+ test2<T, forward_iterator<const T*> >();
+ test2<T, bidirectional_iterator<const T*> >();
+ test2<T, random_access_iterator<const T*> >();
+ test2<T, const T*>();
+}
- test<const int*, const int*, output_iterator<int*> >();
- test<const int*, const int*, forward_iterator<int*> >();
- test<const int*, const int*, bidirectional_iterator<int*> >();
- test<const int*, const int*, random_access_iterator<int*> >();
- test<const int*, const int*, int*>();
+TEST_CONSTEXPR_CXX20 bool test()
+{
+ test1<TrivialSortable>();
+ test1<NonTrivialSortable>();
+ 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 63fe392f19ba..1383986cf77b 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
// <algorithm>
// template<InputIterator InIter1, InputIterator InIter2, typename OutIter,
-// Predicate<auto, InIter2::value_type, InIter1::value_type> Compare>
+// CopyConstructible Compare>
// requires OutputIterator<OutIter, InIter1::reference>
// && OutputIterator<OutIter, InIter2::reference>
-// && CopyConstructible<Compare>
+// && Predicate<Compare, InIter1::value_type, InIter2::value_type>
+// && Predicate<Compare, InIter2::value_type, InIter1::value_type>
// 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 <algorithm>
-#include <functional>
-#include <random>
#include <cassert>
#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<int>(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 <class InIter1, class InIter2, class OutIter>
-void
-test()
+template<class T, class Iter1, class Iter2, class OutIter>
+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<std::greater<int>, int, int> pred((std::greater<int>()));
- 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<int>(2*N-1));
- assert(ic[2*N-1] == 0);
- assert(std::is_sorted(ic, ic+2*N, std::greater<int>()));
- 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<int>());
- std::sort(ib, ib+N, std::greater<int>());
- binary_counting_predicate<std::greater<int>, int, int> pred((std::greater<int>()));
- 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<int>(2*N-1));
- assert(ic[2*N-1] == 0);
- assert(std::is_sorted(ic, ic+2*N, std::greater<int>()));
- 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<class T, class Iter1, class Iter2>
+TEST_CONSTEXPR_CXX20 void test3()
{
- test<input_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, const int*, output_iterator<int*> >();
- test<input_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<input_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<input_iterator<const int*>, const int*, int*>();
-
- test<forward_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, const int*, output_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, int*>();
-
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, const int*, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, int*>();
-
- test<random_access_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, const int*, output_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, int*>();
-
- test<const int*, input_iterator<const int*>, output_iterator<int*> >();
- test<const int*, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, input_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, input_iterator<const int*>, int*>();
-
- test<const int*, forward_iterator<const int*>, output_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, forward_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, int*>();
+ test4<T, Iter1, Iter2, output_iterator<T*> >();
+ test4<T, Iter1, Iter2, forward_iterator<T*> >();
+ test4<T, Iter1, Iter2, bidirectional_iterator<T*> >();
+ test4<T, Iter1, Iter2, random_access_iterator<T*> >();
+ test4<T, Iter1, Iter2, T*>();
+}
- test<const int*, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, int*>();
+template<class T, class Iter1>
+TEST_CONSTEXPR_CXX20 void test2()
+{
+ test3<T, Iter1, input_iterator<const T*> >();
+ test3<T, Iter1, forward_iterator<const T*> >();
+ test3<T, Iter1, bidirectional_iterator<const T*> >();
+ test3<T, Iter1, random_access_iterator<const T*> >();
+ test3<T, Iter1, const T*>();
+}
- test<const int*, random_access_iterator<const int*>, output_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, int*>();
+template<class T>
+TEST_CONSTEXPR_CXX20 void test1()
+{
+ test2<T, input_iterator<const T*> >();
+ test2<T, forward_iterator<const T*> >();
+ test2<T, bidirectional_iterator<const T*> >();
+ test2<T, random_access_iterator<const T*> >();
+ test2<T, const T*>();
+}
- test<const int*, const int*, output_iterator<int*> >();
- test<const int*, const int*, forward_iterator<int*> >();
- test<const int*, const int*, bidirectional_iterator<int*> >();
- test<const int*, const int*, random_access_iterator<int*> >();
- test<const int*, const int*, int*>();
+TEST_CONSTEXPR_CXX20 bool test()
+{
+ test1<TrivialSortableWithComp>();
+ test1<NonTrivialSortableWithComp>();
+ 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.
diff erence/set_
diff erence.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.
diff erence/set_
diff erence.pass.cpp
index ec1e671ddaf0..74892901c6aa 100644
--- a/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.
diff erence/set_
diff erence.pass.cpp
+++ b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.
diff erence/set_
diff erence.pass.cpp
@@ -6,6 +6,8 @@
//
//===----------------------------------------------------------------------===//
+// UNSUPPORTED: clang-8
+
// <algorithm>
// template<InputIterator InIter1, InputIterator InIter2, typename OutIter>
@@ -13,7 +15,7 @@
// && OutputIterator<OutIter, InIter2::reference>
// && HasLess<InIter2::value_type, InIter1::value_type>
// && HasLess<InIter1::value_type, InIter2::value_type>
-// OutIter
+// constexpr OutIter // constexpr after C++17
// set_
diff erence(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 <class Iter1, class Iter2, class OutIter>
-void
-test()
+template<class T, class Iter1, class Iter2, class OutIter>
+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_
diff erence(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_
diff erence(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_
diff erence(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_
diff erence(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<class T, class Iter1, class Iter2>
+TEST_CONSTEXPR_CXX20 void test3()
{
- test<input_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, const int*, output_iterator<int*> >();
- test<input_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<input_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<input_iterator<const int*>, const int*, int*>();
-
- test<forward_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, const int*, output_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, int*>();
-
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, const int*, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, int*>();
-
- test<random_access_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, const int*, output_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, int*>();
-
- test<const int*, input_iterator<const int*>, output_iterator<int*> >();
- test<const int*, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, input_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, input_iterator<const int*>, int*>();
+ test4<T, Iter1, Iter2, output_iterator<T*> >();
+ test4<T, Iter1, Iter2, forward_iterator<T*> >();
+ test4<T, Iter1, Iter2, bidirectional_iterator<T*> >();
+ test4<T, Iter1, Iter2, random_access_iterator<T*> >();
+ test4<T, Iter1, Iter2, T*>();
+}
- test<const int*, forward_iterator<const int*>, output_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, forward_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, int*>();
+template<class T, class Iter1>
+TEST_CONSTEXPR_CXX20 void test2()
+{
+ test3<T, Iter1, input_iterator<const T*> >();
+ test3<T, Iter1, forward_iterator<const T*> >();
+ test3<T, Iter1, bidirectional_iterator<const T*> >();
+ test3<T, Iter1, random_access_iterator<const T*> >();
+ test3<T, Iter1, const T*>();
+}
- test<const int*, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, int*>();
+template<class T>
+TEST_CONSTEXPR_CXX20 void test1()
+{
+ test2<T, input_iterator<const T*> >();
+ test2<T, forward_iterator<const T*> >();
+ test2<T, bidirectional_iterator<const T*> >();
+ test2<T, random_access_iterator<const T*> >();
+ test2<T, const T*>();
+}
- test<const int*, random_access_iterator<const int*>, output_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, int*>();
+TEST_CONSTEXPR_CXX20 bool test()
+{
+ test1<TrivialSortable>();
+ test1<NonTrivialSortable>();
+ return true;
+}
- test<const int*, const int*, output_iterator<int*> >();
- test<const int*, const int*, forward_iterator<int*> >();
- test<const int*, const int*, bidirectional_iterator<int*> >();
- test<const int*, const int*, random_access_iterator<int*> >();
- test<const int*, const int*, int*>();
+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.
diff erence/set_
diff erence_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.
diff erence/set_
diff erence_comp.pass.cpp
index 2ed7ca91dfba..8ce83946b404 100644
--- a/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.
diff erence/set_
diff erence_comp.pass.cpp
+++ b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.
diff erence/set_
diff erence_comp.pass.cpp
@@ -6,6 +6,8 @@
//
//===----------------------------------------------------------------------===//
+// UNSUPPORTED: clang-8
+
// <algorithm>
// template<InputIterator InIter1, InputIterator InIter2, typename OutIter,
@@ -14,191 +16,85 @@
// && OutputIterator<OutIter, InIter2::reference>
// && Predicate<Compare, InIter1::value_type, InIter2::value_type>
// && Predicate<Compare, InIter2::value_type, InIter1::value_type>
-// OutIter
+// constexpr OutIter // constexpr after C++17
// set_
diff erence(InIter1 first1, InIter1 last1, InIter2 first2, InIter2 last2,
// OutIter result, Compare comp);
#include <algorithm>
-#include <functional>
#include <cassert>
#include "test_macros.h"
#include "test_iterators.h"
+#include "../../sortable_helpers.h"
-template <class Iter1, class Iter2, class OutIter>
-void
-test()
+template<class T, class Iter1, class Iter2, class OutIter>
+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_
diff erence(Iter1(ia), Iter1(ia+sa),
- Iter2(ib), Iter2(ib+sb), OutIter(ic), std::less<int>());
- 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_
diff erence(Iter1(ib), Iter1(ib+sb),
- Iter2(ia), Iter2(ia+sa), OutIter(ic), std::less<int>());
- 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_
diff erence(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_
diff erence(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<class T, class Iter1, class Iter2>
+TEST_CONSTEXPR_CXX20 void test3()
{
- test<input_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, const int*, output_iterator<int*> >();
- test<input_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<input_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<input_iterator<const int*>, const int*, int*>();
-
- test<forward_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, const int*, output_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, int*>();
-
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, const int*, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, int*>();
-
- test<random_access_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, const int*, output_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, int*>();
-
- test<const int*, input_iterator<const int*>, output_iterator<int*> >();
- test<const int*, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, input_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, input_iterator<const int*>, int*>();
+ test4<T, Iter1, Iter2, output_iterator<T*> >();
+ test4<T, Iter1, Iter2, forward_iterator<T*> >();
+ test4<T, Iter1, Iter2, bidirectional_iterator<T*> >();
+ test4<T, Iter1, Iter2, random_access_iterator<T*> >();
+ test4<T, Iter1, Iter2, T*>();
+}
- test<const int*, forward_iterator<const int*>, output_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, forward_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, int*>();
+template<class T, class Iter1>
+TEST_CONSTEXPR_CXX20 void test2()
+{
+ test3<T, Iter1, input_iterator<const T*> >();
+ test3<T, Iter1, forward_iterator<const T*> >();
+ test3<T, Iter1, bidirectional_iterator<const T*> >();
+ test3<T, Iter1, random_access_iterator<const T*> >();
+ test3<T, Iter1, const T*>();
+}
- test<const int*, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, int*>();
+template<class T>
+TEST_CONSTEXPR_CXX20 void test1()
+{
+ test2<T, input_iterator<const T*> >();
+ test2<T, forward_iterator<const T*> >();
+ test2<T, bidirectional_iterator<const T*> >();
+ test2<T, random_access_iterator<const T*> >();
+ test2<T, const T*>();
+}
- test<const int*, random_access_iterator<const int*>, output_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, int*>();
+TEST_CONSTEXPR_CXX20 bool test()
+{
+ test1<TrivialSortableWithComp>();
+ test1<NonTrivialSortableWithComp>();
+ return true;
+}
- test<const int*, const int*, output_iterator<int*> >();
- test<const int*, const int*, forward_iterator<int*> >();
- test<const int*, const int*, bidirectional_iterator<int*> >();
- test<const int*, const int*, random_access_iterator<int*> >();
- test<const int*, const int*, int*>();
+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 b90aaf7f63fe..ea86e22ab924 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<class T, class Iter1, class Iter2, class OutIter>
+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 <class Iter1, class Iter2, class OutIter>
-void
-test()
+template<class T, class Iter1, class Iter2>
+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<T, Iter1, Iter2, output_iterator<T*> >();
+ test4<T, Iter1, Iter2, forward_iterator<T*> >();
+ test4<T, Iter1, Iter2, bidirectional_iterator<T*> >();
+ test4<T, Iter1, Iter2, random_access_iterator<T*> >();
+ test4<T, Iter1, Iter2, T*>();
}
-int main(int, char**)
+template<class T, class Iter1>
+TEST_CONSTEXPR_CXX20 void test2()
{
- test<input_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, const int*, output_iterator<int*> >();
- test<input_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<input_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<input_iterator<const int*>, const int*, int*>();
-
- test<forward_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, const int*, output_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, int*>();
-
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, const int*, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, int*>();
-
- test<random_access_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, const int*, output_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, int*>();
-
- test<const int*, input_iterator<const int*>, output_iterator<int*> >();
- test<const int*, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, input_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, input_iterator<const int*>, int*>();
-
- test<const int*, forward_iterator<const int*>, output_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, forward_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, int*>();
-
- test<const int*, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, int*>();
+ test3<T, Iter1, input_iterator<const T*> >();
+ test3<T, Iter1, forward_iterator<const T*> >();
+ test3<T, Iter1, bidirectional_iterator<const T*> >();
+ test3<T, Iter1, random_access_iterator<const T*> >();
+ test3<T, Iter1, const T*>();
+}
- test<const int*, random_access_iterator<const int*>, output_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, int*>();
+template<class T>
+TEST_CONSTEXPR_CXX20 void test1()
+{
+ test2<T, input_iterator<const T*> >();
+ test2<T, forward_iterator<const T*> >();
+ test2<T, bidirectional_iterator<const T*> >();
+ test2<T, random_access_iterator<const T*> >();
+ test2<T, const T*>();
+}
- test<const int*, const int*, output_iterator<int*> >();
- test<const int*, const int*, forward_iterator<int*> >();
- test<const int*, const int*, bidirectional_iterator<int*> >();
- test<const int*, const int*, random_access_iterator<int*> >();
- test<const int*, const int*, int*>();
+TEST_CONSTEXPR_CXX20 bool test()
+{
+ test1<TrivialSortable>();
+ test1<NonTrivialSortable>();
+ 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 b1796df78dd7..0ac88f682a50 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 <algorithm>
-#include <functional>
#include <cassert>
#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<class T, class Iter1, class Iter2, class OutIter>
+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 <class Iter1, class Iter2, class OutIter>
-void
-test()
+template<class T, class Iter1, class Iter2>
+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<int>());
- 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<int>());
- assert(base(ce) - ic == sr);
- assert(std::lexicographical_compare(ic, base(ce), ir, ir+sr) == 0);
+ test4<T, Iter1, Iter2, output_iterator<T*> >();
+ test4<T, Iter1, Iter2, forward_iterator<T*> >();
+ test4<T, Iter1, Iter2, bidirectional_iterator<T*> >();
+ test4<T, Iter1, Iter2, random_access_iterator<T*> >();
+ test4<T, Iter1, Iter2, T*>();
}
-int main(int, char**)
+template<class T, class Iter1>
+TEST_CONSTEXPR_CXX20 void test2()
{
- test<input_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, const int*, output_iterator<int*> >();
- test<input_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<input_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<input_iterator<const int*>, const int*, int*>();
-
- test<forward_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, const int*, output_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, int*>();
-
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, const int*, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, int*>();
-
- test<random_access_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, const int*, output_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, int*>();
-
- test<const int*, input_iterator<const int*>, output_iterator<int*> >();
- test<const int*, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, input_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, input_iterator<const int*>, int*>();
-
- test<const int*, forward_iterator<const int*>, output_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, forward_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, int*>();
-
- test<const int*, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, int*>();
+ test3<T, Iter1, input_iterator<const T*> >();
+ test3<T, Iter1, forward_iterator<const T*> >();
+ test3<T, Iter1, bidirectional_iterator<const T*> >();
+ test3<T, Iter1, random_access_iterator<const T*> >();
+ test3<T, Iter1, const T*>();
+}
- test<const int*, random_access_iterator<const int*>, output_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, int*>();
+template<class T>
+TEST_CONSTEXPR_CXX20 void test1()
+{
+ test2<T, input_iterator<const T*> >();
+ test2<T, forward_iterator<const T*> >();
+ test2<T, bidirectional_iterator<const T*> >();
+ test2<T, random_access_iterator<const T*> >();
+ test2<T, const T*>();
+}
- test<const int*, const int*, output_iterator<int*> >();
- test<const int*, const int*, forward_iterator<int*> >();
- test<const int*, const int*, bidirectional_iterator<int*> >();
- test<const int*, const int*, random_access_iterator<int*> >();
- test<const int*, const int*, int*>();
+TEST_CONSTEXPR_CXX20 bool test()
+{
+ test1<TrivialSortableWithComp>();
+ test1<NonTrivialSortableWithComp>();
+ 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.
diff erence/set_symmetric_
diff erence.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.symmetric.
diff erence/set_symmetric_
diff erence.pass.cpp
index f8965dfb2279..9df46afd6917 100644
--- a/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.symmetric.
diff erence/set_symmetric_
diff erence.pass.cpp
+++ b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.symmetric.
diff erence/set_symmetric_
diff erence.pass.cpp
@@ -6,6 +6,8 @@
//
//===----------------------------------------------------------------------===//
+// UNSUPPORTED: clang-8
+
// <algorithm>
// template<InputIterator InIter1, InputIterator InIter2, typename OutIter>
@@ -13,9 +15,8 @@
// && OutputIterator<OutIter, InIter2::reference>
// && HasLess<InIter2::value_type, InIter1::value_type>
// && HasLess<InIter1::value_type, InIter2::value_type>
-// OutIter
-// set_symmetric_
diff erence(InIter1 first1, InIter1 last1,
-// InIter2 first2, InIter2 last2,
+// constexpr OutIter // constexpr after C++17
+// set_symmetric_
diff erence(InIter1 first1, InIter1 last1, InIter2 first2, InIter2 last2,
// OutIter result);
#include <algorithm>
@@ -23,179 +24,76 @@
#include "test_macros.h"
#include "test_iterators.h"
+#include "../../sortable_helpers.h"
-template <class Iter1, class Iter2, class OutIter>
-void
-test()
+template<class T, class Iter1, class Iter2, class OutIter>
+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_
diff erence(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_
diff erence(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_
diff erence(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_
diff erence(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<class T, class Iter1, class Iter2>
+TEST_CONSTEXPR_CXX20 void test3()
{
- test<input_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, const int*, output_iterator<int*> >();
- test<input_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<input_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<input_iterator<const int*>, const int*, int*>();
-
- test<forward_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, const int*, output_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, int*>();
-
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, const int*, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, int*>();
-
- test<random_access_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, const int*, output_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, int*>();
-
- test<const int*, input_iterator<const int*>, output_iterator<int*> >();
- test<const int*, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, input_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, input_iterator<const int*>, int*>();
+ test4<T, Iter1, Iter2, output_iterator<T*> >();
+ test4<T, Iter1, Iter2, forward_iterator<T*> >();
+ test4<T, Iter1, Iter2, bidirectional_iterator<T*> >();
+ test4<T, Iter1, Iter2, random_access_iterator<T*> >();
+ test4<T, Iter1, Iter2, T*>();
+}
- test<const int*, forward_iterator<const int*>, output_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, forward_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, int*>();
+template<class T, class Iter1>
+TEST_CONSTEXPR_CXX20 void test2()
+{
+ test3<T, Iter1, input_iterator<const T*> >();
+ test3<T, Iter1, forward_iterator<const T*> >();
+ test3<T, Iter1, bidirectional_iterator<const T*> >();
+ test3<T, Iter1, random_access_iterator<const T*> >();
+ test3<T, Iter1, const T*>();
+}
- test<const int*, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, int*>();
+template<class T>
+TEST_CONSTEXPR_CXX20 void test1()
+{
+ test2<T, input_iterator<const T*> >();
+ test2<T, forward_iterator<const T*> >();
+ test2<T, bidirectional_iterator<const T*> >();
+ test2<T, random_access_iterator<const T*> >();
+ test2<T, const T*>();
+}
- test<const int*, random_access_iterator<const int*>, output_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, int*>();
+TEST_CONSTEXPR_CXX20 bool test()
+{
+ test1<TrivialSortable>();
+ test1<NonTrivialSortable>();
+ return true;
+}
- test<const int*, const int*, output_iterator<int*> >();
- test<const int*, const int*, forward_iterator<int*> >();
- test<const int*, const int*, bidirectional_iterator<int*> >();
- test<const int*, const int*, random_access_iterator<int*> >();
- test<const int*, const int*, int*>();
+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.
diff erence/set_symmetric_
diff erence_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.symmetric.
diff erence/set_symmetric_
diff erence_comp.pass.cpp
index 5e67074280eb..f947d185c1aa 100644
--- a/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.symmetric.
diff erence/set_symmetric_
diff erence_comp.pass.cpp
+++ b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.symmetric.
diff erence/set_symmetric_
diff erence_comp.pass.cpp
@@ -6,6 +6,8 @@
//
//===----------------------------------------------------------------------===//
+// UNSUPPORTED: clang-8
+
// <algorithm>
// template<InputIterator InIter1, InputIterator InIter2, typename OutIter,
@@ -14,192 +16,85 @@
// && OutputIterator<OutIter, InIter2::reference>
// && Predicate<Compare, InIter1::value_type, InIter2::value_type>
// && Predicate<Compare, InIter2::value_type, InIter1::value_type>
-// OutIter
-// set_symmetric_
diff erence(InIter1 first1, InIter1 last1,
-// InIter2 first2, InIter2 last2,
+// constexpr OutIter // constexpr after C++17
+// set_symmetric_
diff erence(InIter1 first1, InIter1 last1, InIter2 first2, InIter2 last2,
// OutIter result, Compare comp);
#include <algorithm>
-#include <functional>
#include <cassert>
#include "test_macros.h"
#include "test_iterators.h"
+#include "../../sortable_helpers.h"
-template <class Iter1, class Iter2, class OutIter>
-void
-test()
+template<class T, class Iter1, class Iter2, class OutIter>
+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_
diff erence(Iter1(ia), Iter1(ia+sa),
- Iter2(ib), Iter2(ib+sb),
- OutIter(ic), std::less<int>());
- assert(base(ce) - ic == sr);
- assert(std::lexicographical_compare(ic, base(ce), ir, ir+sr) == 0);
- ce = std::set_symmetric_
diff erence(Iter1(ib), Iter1(ib+sb),
- Iter2(ia), Iter2(ia+sa),
- OutIter(ic), std::less<int>());
- 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_
diff erence(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_
diff erence(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<class T, class Iter1, class Iter2>
+TEST_CONSTEXPR_CXX20 void test3()
{
- test<input_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, const int*, output_iterator<int*> >();
- test<input_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<input_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<input_iterator<const int*>, const int*, int*>();
-
- test<forward_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, const int*, output_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, int*>();
-
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, const int*, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, int*>();
-
- test<random_access_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, const int*, output_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, int*>();
-
- test<const int*, input_iterator<const int*>, output_iterator<int*> >();
- test<const int*, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, input_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, input_iterator<const int*>, int*>();
+ test4<T, Iter1, Iter2, output_iterator<T*> >();
+ test4<T, Iter1, Iter2, forward_iterator<T*> >();
+ test4<T, Iter1, Iter2, bidirectional_iterator<T*> >();
+ test4<T, Iter1, Iter2, random_access_iterator<T*> >();
+ test4<T, Iter1, Iter2, T*>();
+}
- test<const int*, forward_iterator<const int*>, output_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, forward_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, int*>();
+template<class T, class Iter1>
+TEST_CONSTEXPR_CXX20 void test2()
+{
+ test3<T, Iter1, input_iterator<const T*> >();
+ test3<T, Iter1, forward_iterator<const T*> >();
+ test3<T, Iter1, bidirectional_iterator<const T*> >();
+ test3<T, Iter1, random_access_iterator<const T*> >();
+ test3<T, Iter1, const T*>();
+}
- test<const int*, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, int*>();
+template<class T>
+TEST_CONSTEXPR_CXX20 void test1()
+{
+ test2<T, input_iterator<const T*> >();
+ test2<T, forward_iterator<const T*> >();
+ test2<T, bidirectional_iterator<const T*> >();
+ test2<T, random_access_iterator<const T*> >();
+ test2<T, const T*>();
+}
- test<const int*, random_access_iterator<const int*>, output_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, int*>();
+TEST_CONSTEXPR_CXX20 bool test()
+{
+ test1<TrivialSortableWithComp>();
+ test1<NonTrivialSortableWithComp>();
+ return true;
+}
- test<const int*, const int*, output_iterator<int*> >();
- test<const int*, const int*, forward_iterator<int*> >();
- test<const int*, const int*, bidirectional_iterator<int*> >();
- test<const int*, const int*, random_access_iterator<int*> >();
- test<const int*, const int*, int*>();
+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 a4196cab2031..e8f69631162c 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
+
// <algorithm>
// template<InputIterator InIter1, InputIterator InIter2, typename OutIter>
@@ -13,188 +15,85 @@
// && OutputIterator<OutIter, InIter2::reference>
// && HasLess<InIter2::value_type, InIter1::value_type>
// && HasLess<InIter1::value_type, InIter2::value_type>
-// 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 <algorithm>
#include <cassert>
#include "test_macros.h"
#include "test_iterators.h"
+#include "../../sortable_helpers.h"
-template <class Iter1, class Iter2, class OutIter>
-void
-test()
+template<class T, class Iter1, class Iter2, class OutIter>
+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<class T, class Iter1, class Iter2>
+TEST_CONSTEXPR_CXX20 void test3()
{
- test<input_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, const int*, output_iterator<int*> >();
- test<input_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<input_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<input_iterator<const int*>, const int*, int*>();
-
- test<forward_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, const int*, output_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, int*>();
-
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, const int*, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, int*>();
-
- test<random_access_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, const int*, output_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, int*>();
-
- test<const int*, input_iterator<const int*>, output_iterator<int*> >();
- test<const int*, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, input_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, input_iterator<const int*>, int*>();
+ test4<T, Iter1, Iter2, output_iterator<T*> >();
+ test4<T, Iter1, Iter2, forward_iterator<T*> >();
+ test4<T, Iter1, Iter2, bidirectional_iterator<T*> >();
+ test4<T, Iter1, Iter2, random_access_iterator<T*> >();
+ test4<T, Iter1, Iter2, T*>();
+}
- test<const int*, forward_iterator<const int*>, output_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, forward_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, int*>();
+template<class T, class Iter1>
+TEST_CONSTEXPR_CXX20 void test2()
+{
+ test3<T, Iter1, input_iterator<const T*> >();
+ test3<T, Iter1, forward_iterator<const T*> >();
+ test3<T, Iter1, bidirectional_iterator<const T*> >();
+ test3<T, Iter1, random_access_iterator<const T*> >();
+ test3<T, Iter1, const T*>();
+}
- test<const int*, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, int*>();
+template<class T>
+TEST_CONSTEXPR_CXX20 void test1()
+{
+ test2<T, input_iterator<const T*> >();
+ test2<T, forward_iterator<const T*> >();
+ test2<T, bidirectional_iterator<const T*> >();
+ test2<T, random_access_iterator<const T*> >();
+ test2<T, const T*>();
+}
- test<const int*, random_access_iterator<const int*>, output_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, int*>();
+TEST_CONSTEXPR_CXX20 bool test()
+{
+ test1<TrivialSortable>();
+ test1<NonTrivialSortable>();
+ return true;
+}
- test<const int*, const int*, output_iterator<int*> >();
- test<const int*, const int*, forward_iterator<int*> >();
- test<const int*, const int*, bidirectional_iterator<int*> >();
- test<const int*, const int*, random_access_iterator<int*> >();
- test<const int*, const int*, int*>();
+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 aa4828b10895..07ec934255e2 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
+
// <algorithm>
// template<InputIterator InIter1, InputIterator InIter2, typename OutIter,
@@ -14,189 +16,85 @@
// && OutputIterator<OutIter, InIter2::reference>
// && Predicate<Compare, InIter1::value_type, InIter2::value_type>
// && Predicate<Compare, InIter2::value_type, InIter1::value_type>
-// OutIter
+// constexpr OutIter // constexpr after C++17
// set_union(InIter1 first1, InIter1 last1, InIter2 first2, InIter2 last2,
// OutIter result, Compare comp);
#include <algorithm>
-#include <functional>
#include <cassert>
#include "test_macros.h"
#include "test_iterators.h"
+#include "../../sortable_helpers.h"
-template <class Iter1, class Iter2, class OutIter>
-void
-test()
+template<class T, class Iter1, class Iter2, class OutIter>
+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<int>());
- 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<int>());
- 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<class T, class Iter1, class Iter2>
+TEST_CONSTEXPR_CXX20 void test3()
{
- test<input_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<input_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<input_iterator<const int*>, const int*, output_iterator<int*> >();
- test<input_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<input_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<input_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<input_iterator<const int*>, const int*, int*>();
-
- test<forward_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<forward_iterator<const int*>, const int*, output_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<forward_iterator<const int*>, const int*, int*>();
-
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<bidirectional_iterator<const int*>, const int*, output_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<bidirectional_iterator<const int*>, const int*, int*>();
-
- test<random_access_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, input_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, forward_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, random_access_iterator<const int*>, int*>();
-
- test<random_access_iterator<const int*>, const int*, output_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, forward_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, random_access_iterator<int*> >();
- test<random_access_iterator<const int*>, const int*, int*>();
-
- test<const int*, input_iterator<const int*>, output_iterator<int*> >();
- test<const int*, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, input_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, input_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, input_iterator<const int*>, int*>();
+ test4<T, Iter1, Iter2, output_iterator<T*> >();
+ test4<T, Iter1, Iter2, forward_iterator<T*> >();
+ test4<T, Iter1, Iter2, bidirectional_iterator<T*> >();
+ test4<T, Iter1, Iter2, random_access_iterator<T*> >();
+ test4<T, Iter1, Iter2, T*>();
+}
- test<const int*, forward_iterator<const int*>, output_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, forward_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, forward_iterator<const int*>, int*>();
+template<class T, class Iter1>
+TEST_CONSTEXPR_CXX20 void test2()
+{
+ test3<T, Iter1, input_iterator<const T*> >();
+ test3<T, Iter1, forward_iterator<const T*> >();
+ test3<T, Iter1, bidirectional_iterator<const T*> >();
+ test3<T, Iter1, random_access_iterator<const T*> >();
+ test3<T, Iter1, const T*>();
+}
- test<const int*, bidirectional_iterator<const int*>, output_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, bidirectional_iterator<const int*>, int*>();
+template<class T>
+TEST_CONSTEXPR_CXX20 void test1()
+{
+ test2<T, input_iterator<const T*> >();
+ test2<T, forward_iterator<const T*> >();
+ test2<T, bidirectional_iterator<const T*> >();
+ test2<T, random_access_iterator<const T*> >();
+ test2<T, const T*>();
+}
- test<const int*, random_access_iterator<const int*>, output_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, forward_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, random_access_iterator<int*> >();
- test<const int*, random_access_iterator<const int*>, int*>();
+TEST_CONSTEXPR_CXX20 bool test()
+{
+ test1<TrivialSortableWithComp>();
+ test1<NonTrivialSortableWithComp>();
+ return true;
+}
- test<const int*, const int*, output_iterator<int*> >();
- test<const int*, const int*, forward_iterator<int*> >();
- test<const int*, const int*, bidirectional_iterator<int*> >();
- test<const int*, const int*, random_access_iterator<int*> >();
- test<const int*, const int*, int*>();
+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 000000000000..a5c138e071ab
--- /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 <type_traits>
+
+#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<TrivialSortable>::value, "");
+static_assert(std::is_trivially_copyable<TrivialSortableWithComp>::value, "");
+static_assert(!std::is_trivially_copyable<NonTrivialSortable>::value, "");
+static_assert(!std::is_trivially_copyable<NonTrivialSortableWithComp>::value, "");
+
+#endif // SORTABLE_HELPERS_H
More information about the llvm-branch-commits
mailing list