Implement C++20 p0879 - Constexpr for swap and swap related functions.
This is much smaller than the first but also basically marks swap and
the algorithms that depend on swap as constexpr.
It is similarly tested on x86_64-linux:
$ make check -k -j4
$ make check RUNTESTFLAGS=--target_board=unix/-std=gnu++2a -k -j4
OK for trunk (after part 1 is in)?
Ed Smith-Rowland
2019-06-26 Edward Smith-Rowland <[email protected]>
Implement C++20 p0879 - Constexpr for swap and swap related functions.
* include/bits/algorithmfwd.h (__cpp_lib_constexpr_swap_algorithms):
New macro. (iter_swap, make_heap, next_permutation, partial_sort_copy,
pop_heap, prev_permutation, push_heap, reverse, rotate, sort_heap,
swap, swap_ranges, nth_element, partial_sort, sort): Add constexpr.
* include/bits/move.h (swap): Add constexpr.
* include/bits/stl_algo.h (__move_median_to_first, __reverse, reverse,
__gcd, __rotate, rotate, __partition, __heap_select,
__partial_sort_copy, partial_sort_copy, __unguarded_partition,
__unguarded_partition_pivot, __partial_sort, __introsort_loop, __sort,
__introselect, __chunk_insertion_sort, next_permutation,
prev_permutation, partition, partial_sort, nth_element, sort,
__iter_swap::iter_swap, iter_swap, swap_ranges): Add constexpr.
* include/bits/stl_algobase.h (__iter_swap::iter_swap, iter_swap,
swap_ranges): Add constexpr.
* include/bits/stl_heap.h (__push_heap, push_heap, __adjust_heap,
__pop_heap, pop_heap, __make_heap, make_heap, __sort_heap, sort_heap):
Add constexpr.
* include/std/type_traits (swap): Add constexpr.
* testsuite/25_algorithms/headers/algorithm/synopsis.cc: Add constexpr.
* testsuite/25_algorithms/iter_swap/constexpr.cc: New test.
* testsuite/25_algorithms/make_heap/constexpr.cc: New test.
* testsuite/25_algorithms/next_permutation/constexpr.cc: New test.
* testsuite/25_algorithms/nth_element/constexpr.cc: New test.
* testsuite/25_algorithms/partial_sort/constexpr.cc: New test.
* testsuite/25_algorithms/partial_sort_copy/constexpr.cc: New test.
* testsuite/25_algorithms/partition/constexpr.cc: New test.
* testsuite/25_algorithms/pop_heap/constexpr.cc: New test.
* testsuite/25_algorithms/prev_permutation/constexpr.cc: New test.
* testsuite/25_algorithms/push_heap/constexpr.cc: New test.
* testsuite/25_algorithms/reverse/constexpr.cc: New test.
* testsuite/25_algorithms/rotate/constexpr.cc: New test.
* testsuite/25_algorithms/sort/constexpr.cc: New test.
* testsuite/25_algorithms/sort_heap/constexpr.cc: New test.
* testsuite/25_algorithms/swap/constexpr.cc: New test.
* testsuite/25_algorithms/swap_ranges/constexpr.cc: New test.
diff --git a/libstdc++-v3/include/bits/algorithmfwd.h
b/libstdc++-v3/include/bits/algorithmfwd.h
index 14bdad9a61e..28b3388edaf 100644
--- a/libstdc++-v3/include/bits/algorithmfwd.h
+++ b/libstdc++-v3/include/bits/algorithmfwd.h
@@ -193,6 +193,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
#if __cplusplus > 201703L
# define __cpp_lib_constexpr_algorithms 201711L
+# define __cpp_lib_constexpr_swap_algorithms 201712L
#endif
#if __cplusplus >= 201103L
@@ -377,6 +378,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
#endif
template<typename _FIter1, typename _FIter2>
+ _GLIBCXX20_CONSTEXPR
void
iter_swap(_FIter1, _FIter2);
@@ -391,10 +393,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
lower_bound(_FIter, _FIter, const _Tp&, _Compare);
template<typename _RAIter>
+ _GLIBCXX20_CONSTEXPR
void
make_heap(_RAIter, _RAIter);
template<typename _RAIter, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
void
make_heap(_RAIter, _RAIter, _Compare);
@@ -478,10 +482,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
// mismatch
template<typename _BIter>
+ _GLIBCXX20_CONSTEXPR
bool
next_permutation(_BIter, _BIter);
template<typename _BIter, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
bool
next_permutation(_BIter, _BIter, _Compare);
@@ -496,10 +502,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
// partial_sort
template<typename _IIter, typename _RAIter>
+ _GLIBCXX20_CONSTEXPR
_RAIter
partial_sort_copy(_IIter, _IIter, _RAIter, _RAIter);
template<typename _IIter, typename _RAIter, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
_RAIter
partial_sort_copy(_IIter, _IIter, _RAIter, _RAIter, _Compare);
@@ -519,26 +527,32 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
#endif
template<typename _RAIter>
+ _GLIBCXX20_CONSTEXPR
void
pop_heap(_RAIter, _RAIter);
template<typename _RAIter, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
void
pop_heap(_RAIter, _RAIter, _Compare);
template<typename _BIter>
+ _GLIBCXX20_CONSTEXPR
bool
prev_permutation(_BIter, _BIter);
template<typename _BIter, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
bool
prev_permutation(_BIter, _BIter, _Compare);
template<typename _RAIter>
+ _GLIBCXX20_CONSTEXPR
void
push_heap(_RAIter, _RAIter);
template<typename _RAIter, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
void
push_heap(_RAIter, _RAIter, _Compare);
@@ -579,6 +593,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
// replace_if
template<typename _BIter>
+ _GLIBCXX20_CONSTEXPR
void
reverse(_BIter, _BIter);
@@ -590,6 +605,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
inline namespace _V2
{
template<typename _FIter>
+ _GLIBCXX20_CONSTEXPR
_FIter
rotate(_FIter, _FIter, _FIter);
}
@@ -613,10 +629,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
#endif
template<typename _RAIter>
+ _GLIBCXX20_CONSTEXPR
void
sort_heap(_RAIter, _RAIter);
template<typename _RAIter, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
void
sort_heap(_RAIter, _RAIter, _Compare);
@@ -628,15 +646,18 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
// For C++11 swap() is declared in <type_traits>.
template<typename _Tp, size_t _Nm>
+ _GLIBCXX20_CONSTEXPR
inline void
swap(_Tp& __a, _Tp& __b);
template<typename _Tp, size_t _Nm>
+ _GLIBCXX20_CONSTEXPR
inline void
swap(_Tp (&__a)[_Nm], _Tp (&__b)[_Nm]);
#endif
template<typename _FIter1, typename _FIter2>
+ _GLIBCXX20_CONSTEXPR
_FIter2
swap_ranges(_FIter1, _FIter1, _FIter2);
@@ -783,22 +804,27 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
mismatch(_IIter1, _IIter1, _IIter2, _BinaryPredicate);
template<typename _RAIter>
+ _GLIBCXX20_CONSTEXPR
void
nth_element(_RAIter, _RAIter, _RAIter);
template<typename _RAIter, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
void
nth_element(_RAIter, _RAIter, _RAIter, _Compare);
template<typename _RAIter>
+ _GLIBCXX20_CONSTEXPR
void
partial_sort(_RAIter, _RAIter, _RAIter);
template<typename _RAIter, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
void
partial_sort(_RAIter, _RAIter, _RAIter, _Compare);
template<typename _BIter, typename _Predicate>
+ _GLIBCXX20_CONSTEXPR
_BIter
partition(_BIter, _BIter, _Predicate);
@@ -892,10 +918,12 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
set_union(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare);
template<typename _RAIter>
+ _GLIBCXX20_CONSTEXPR
void
sort(_RAIter, _RAIter);
template<typename _RAIter, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
void
sort(_RAIter, _RAIter, _Compare);
diff --git a/libstdc++-v3/include/bits/move.h b/libstdc++-v3/include/bits/move.h
index 7271e273e8e..51895ff3a00 100644
--- a/libstdc++-v3/include/bits/move.h
+++ b/libstdc++-v3/include/bits/move.h
@@ -174,6 +174,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* @return Nothing.
*/
template<typename _Tp>
+ _GLIBCXX20_CONSTEXPR
inline
#if __cplusplus >= 201103L
typename enable_if<__and_<__not_<__is_tuple_like<_Tp>>,
@@ -198,6 +199,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
// DR 809. std::swap should be overloaded for array types.
/// Swap the contents of two arrays.
template<typename _Tp, size_t _Nm>
+ _GLIBCXX20_CONSTEXPR
inline
#if __cplusplus >= 201103L
typename enable_if<__is_swappable<_Tp>::value>::type
diff --git a/libstdc++-v3/include/bits/stl_algo.h
b/libstdc++-v3/include/bits/stl_algo.h
index c4065b30188..c6226f6cb5a 100644
--- a/libstdc++-v3/include/bits/stl_algo.h
+++ b/libstdc++-v3/include/bits/stl_algo.h
@@ -74,6 +74,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
/// Swaps the median value of *__a, *__b and *__c under __comp to *__result
template<typename _Iterator, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
void
__move_median_to_first(_Iterator __result,_Iterator __a, _Iterator __b,
_Iterator __c, _Compare __comp)
@@ -1162,6 +1163,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* overloaded for bidirectional iterators.
*/
template<typename _BidirectionalIterator>
+ _GLIBCXX20_CONSTEXPR
void
__reverse(_BidirectionalIterator __first, _BidirectionalIterator __last,
bidirectional_iterator_tag)
@@ -1182,6 +1184,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* overloaded for random access iterators.
*/
template<typename _RandomAccessIterator>
+ _GLIBCXX20_CONSTEXPR
void
__reverse(_RandomAccessIterator __first, _RandomAccessIterator __last,
random_access_iterator_tag)
@@ -1210,6 +1213,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* swaps @p *(__first+i) and @p *(__last-(i+1))
*/
template<typename _BidirectionalIterator>
+ _GLIBCXX20_CONSTEXPR
inline void
reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
{
@@ -1263,6 +1267,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* It returns the greatest common divisor of two integer values.
*/
template<typename _EuclideanRingElement>
+ _GLIBCXX20_CONSTEXPR
_EuclideanRingElement
__gcd(_EuclideanRingElement __m, _EuclideanRingElement __n)
{
@@ -1280,6 +1285,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
/// This is a helper function for the rotate algorithm.
template<typename _ForwardIterator>
+ _GLIBCXX20_CONSTEXPR
_ForwardIterator
__rotate(_ForwardIterator __first,
_ForwardIterator __middle,
@@ -1316,6 +1322,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
/// This is a helper function for the rotate algorithm.
template<typename _BidirectionalIterator>
+ _GLIBCXX20_CONSTEXPR
_BidirectionalIterator
__rotate(_BidirectionalIterator __first,
_BidirectionalIterator __middle,
@@ -1349,6 +1356,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
/// This is a helper function for the rotate algorithm.
template<typename _RandomAccessIterator>
+ _GLIBCXX20_CONSTEXPR
_RandomAccessIterator
__rotate(_RandomAccessIterator __first,
_RandomAccessIterator __middle,
@@ -1450,6 +1458,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* for each @p n in the range @p [0,__last-__first).
*/
template<typename _ForwardIterator>
+ _GLIBCXX20_CONSTEXPR
inline _ForwardIterator
rotate(_ForwardIterator __first, _ForwardIterator __middle,
_ForwardIterator __last)
@@ -1510,6 +1519,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
/// This is a helper function...
template<typename _ForwardIterator, typename _Predicate>
+ _GLIBCXX20_CONSTEXPR
_ForwardIterator
__partition(_ForwardIterator __first, _ForwardIterator __last,
_Predicate __pred, forward_iterator_tag)
@@ -1535,6 +1545,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
/// This is a helper function...
template<typename _BidirectionalIterator, typename _Predicate>
+ _GLIBCXX20_CONSTEXPR
_BidirectionalIterator
__partition(_BidirectionalIterator __first, _BidirectionalIterator __last,
_Predicate __pred, bidirectional_iterator_tag)
@@ -1689,6 +1700,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
/// This is a helper function for the sort routines.
template<typename _RandomAccessIterator, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
void
__heap_select(_RandomAccessIterator __first,
_RandomAccessIterator __middle,
@@ -1704,6 +1716,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
template<typename _InputIterator, typename _RandomAccessIterator,
typename _Compare>
+ _GLIBCXX20_CONSTEXPR
_RandomAccessIterator
__partial_sort_copy(_InputIterator __first, _InputIterator __last,
_RandomAccessIterator __result_first,
@@ -1758,6 +1771,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* The value returned is @p __result_first+N.
*/
template<typename _InputIterator, typename _RandomAccessIterator>
+ _GLIBCXX20_CONSTEXPR
inline _RandomAccessIterator
partial_sort_copy(_InputIterator __first, _InputIterator __last,
_RandomAccessIterator __result_first,
@@ -1808,6 +1822,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
*/
template<typename _InputIterator, typename _RandomAccessIterator,
typename _Compare>
+ _GLIBCXX20_CONSTEXPR
inline _RandomAccessIterator
partial_sort_copy(_InputIterator __first, _InputIterator __last,
_RandomAccessIterator __result_first,
@@ -1921,6 +1936,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
/// This is a helper function...
template<typename _RandomAccessIterator, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
_RandomAccessIterator
__unguarded_partition(_RandomAccessIterator __first,
_RandomAccessIterator __last,
@@ -1942,6 +1958,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
/// This is a helper function...
template<typename _RandomAccessIterator, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
inline _RandomAccessIterator
__unguarded_partition_pivot(_RandomAccessIterator __first,
_RandomAccessIterator __last, _Compare __comp)
@@ -1953,6 +1970,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
template<typename _RandomAccessIterator, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
inline void
__partial_sort(_RandomAccessIterator __first,
_RandomAccessIterator __middle,
@@ -1965,6 +1983,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
/// This is a helper function for the sort routine.
template<typename _RandomAccessIterator, typename _Size, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
void
__introsort_loop(_RandomAccessIterator __first,
_RandomAccessIterator __last,
@@ -1988,6 +2007,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
// sort
template<typename _RandomAccessIterator, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
inline void
__sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
_Compare __comp)
@@ -2002,6 +2022,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
template<typename _RandomAccessIterator, typename _Size, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
void
__introselect(_RandomAccessIterator __first, _RandomAccessIterator __nth,
_RandomAccessIterator __last, _Size __depth_limit,
@@ -2718,6 +2739,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
template<typename _RandomAccessIterator, typename _Distance,
typename _Compare>
+ _GLIBCXX20_CONSTEXPR
void
__chunk_insertion_sort(_RandomAccessIterator __first,
_RandomAccessIterator __last,
@@ -2987,6 +3009,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* is the largest of the set, the smallest is generated and false returned.
*/
template<typename _BidirectionalIterator>
+ _GLIBCXX20_CONSTEXPR
inline bool
next_permutation(_BidirectionalIterator __first,
_BidirectionalIterator __last)
@@ -3019,6 +3042,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* smallest is generated and false returned.
*/
template<typename _BidirectionalIterator, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
inline bool
next_permutation(_BidirectionalIterator __first,
_BidirectionalIterator __last, _Compare __comp)
@@ -3088,6 +3112,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* returned.
*/
template<typename _BidirectionalIterator>
+ _GLIBCXX20_CONSTEXPR
inline bool
prev_permutation(_BidirectionalIterator __first,
_BidirectionalIterator __last)
@@ -3120,6 +3145,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the largest is generated and false returned.
*/
template<typename _BidirectionalIterator, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
inline bool
prev_permutation(_BidirectionalIterator __first,
_BidirectionalIterator __last, _Compare __comp)
@@ -4714,6 +4740,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
* @p stable_partition() if this is needed.
*/
template<typename _ForwardIterator, typename _Predicate>
+ _GLIBCXX20_CONSTEXPR
inline _ForwardIterator
partition(_ForwardIterator __first, _ForwardIterator __last,
_Predicate __pred)
@@ -4747,6 +4774,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
* the range @p [__middle,__last) then *j<*i and *k<*i are both false.
*/
template<typename _RandomAccessIterator>
+ _GLIBCXX20_CONSTEXPR
inline void
partial_sort(_RandomAccessIterator __first,
_RandomAccessIterator __middle,
@@ -4785,6 +4813,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
* are both false.
*/
template<typename _RandomAccessIterator, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
inline void
partial_sort(_RandomAccessIterator __first,
_RandomAccessIterator __middle,
@@ -4821,6 +4850,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
* holds that *j < *i is false.
*/
template<typename _RandomAccessIterator>
+ _GLIBCXX20_CONSTEXPR
inline void
nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth,
_RandomAccessIterator __last)
@@ -4860,6 +4890,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
* holds that @p __comp(*j,*i) is false.
*/
template<typename _RandomAccessIterator, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
inline void
nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth,
_RandomAccessIterator __last, _Compare __comp)
@@ -4897,6 +4928,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
* @p stable_sort() if this is needed.
*/
template<typename _RandomAccessIterator>
+ _GLIBCXX20_CONSTEXPR
inline void
sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
{
@@ -4927,6 +4959,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
* @p stable_sort() if this is needed.
*/
template<typename _RandomAccessIterator, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
inline void
sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
_Compare __comp)
diff --git a/libstdc++-v3/include/bits/stl_algobase.h
b/libstdc++-v3/include/bits/stl_algobase.h
index 43cff8c7d02..ea2863bcc61 100644
--- a/libstdc++-v3/include/bits/stl_algobase.h
+++ b/libstdc++-v3/include/bits/stl_algobase.h
@@ -138,6 +138,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
struct __iter_swap
{
template<typename _ForwardIterator1, typename _ForwardIterator2>
+ _GLIBCXX20_CONSTEXPR
static void
iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
{
@@ -153,6 +154,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
struct __iter_swap<true>
{
template<typename _ForwardIterator1, typename _ForwardIterator2>
+ _GLIBCXX20_CONSTEXPR
static void
iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
{
@@ -172,6 +174,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* iterators themselves.
*/
template<typename _ForwardIterator1, typename _ForwardIterator2>
+ _GLIBCXX20_CONSTEXPR
inline void
iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
{
@@ -218,6 +221,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* The ranges must not overlap.
*/
template<typename _ForwardIterator1, typename _ForwardIterator2>
+ _GLIBCXX20_CONSTEXPR
_ForwardIterator2
swap_ranges(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
_ForwardIterator2 __first2)
diff --git a/libstdc++-v3/include/bits/stl_heap.h
b/libstdc++-v3/include/bits/stl_heap.h
index d9530e66621..7eb12f04321 100644
--- a/libstdc++-v3/include/bits/stl_heap.h
+++ b/libstdc++-v3/include/bits/stl_heap.h
@@ -129,6 +129,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
template<typename _RandomAccessIterator, typename _Distance, typename _Tp,
typename _Compare>
+ _GLIBCXX20_CONSTEXPR
void
__push_heap(_RandomAccessIterator __first,
_Distance __holeIndex, _Distance __topIndex, _Tp __value,
@@ -155,6 +156,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* [__first,__last) is a valid heap.
*/
template<typename _RandomAccessIterator>
+ _GLIBCXX20_CONSTEXPR
inline void
push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
{
@@ -190,6 +192,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* performed using comp.
*/
template<typename _RandomAccessIterator, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
inline void
push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
_Compare __comp)
@@ -215,6 +218,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
template<typename _RandomAccessIterator, typename _Distance,
typename _Tp, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
void
__adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex,
_Distance __len, _Tp __value, _Compare __comp)
@@ -244,6 +248,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
template<typename _RandomAccessIterator, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
inline void
__pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
_RandomAccessIterator __result, _Compare& __comp)
@@ -272,6 +277,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* heap.
*/
template<typename _RandomAccessIterator>
+ _GLIBCXX20_CONSTEXPR
inline void
pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
{
@@ -305,6 +311,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* heap. Comparisons are made using comp.
*/
template<typename _RandomAccessIterator, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
inline void
pop_heap(_RandomAccessIterator __first,
_RandomAccessIterator __last, _Compare __comp)
@@ -327,6 +334,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
template<typename _RandomAccessIterator, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
void
__make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
_Compare& __comp)
@@ -361,6 +369,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* This operation makes the elements in [__first,__last) into a heap.
*/
template<typename _RandomAccessIterator>
+ _GLIBCXX20_CONSTEXPR
inline void
make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
{
@@ -387,6 +396,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* Comparisons are made using __comp.
*/
template<typename _RandomAccessIterator, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
inline void
make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
_Compare __comp)
@@ -403,6 +413,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
template<typename _RandomAccessIterator, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
void
__sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
_Compare& __comp)
@@ -423,6 +434,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* This operation sorts the valid heap in the range [__first,__last).
*/
template<typename _RandomAccessIterator>
+ _GLIBCXX20_CONSTEXPR
inline void
sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
{
@@ -450,6 +462,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* Comparisons are made using __comp.
*/
template<typename _RandomAccessIterator, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
inline void
sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
_Compare __comp)
diff --git a/libstdc++-v3/include/std/type_traits
b/libstdc++-v3/include/std/type_traits
index e53d3c8d535..6e9e2f3385d 100644
--- a/libstdc++-v3/include/std/type_traits
+++ b/libstdc++-v3/include/std/type_traits
@@ -2643,6 +2643,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ };
template<typename _Tp>
+ _GLIBCXX20_CONSTEXPR
inline
typename enable_if<__and_<__not_<__is_tuple_like<_Tp>>,
is_move_constructible<_Tp>,
@@ -2652,6 +2653,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
is_nothrow_move_assignable<_Tp>>::value);
template<typename _Tp, size_t _Nm>
+ _GLIBCXX20_CONSTEXPR
inline
typename enable_if<__is_swappable<_Tp>::value>::type
swap(_Tp (&__a)[_Nm], _Tp (&__b)[_Nm])
diff --git a/libstdc++-v3/testsuite/25_algorithms/headers/algorithm/synopsis.cc
b/libstdc++-v3/testsuite/25_algorithms/headers/algorithm/synopsis.cc
index d3b3540deb4..07dd7fbfac1 100644
--- a/libstdc++-v3/testsuite/25_algorithms/headers/algorithm/synopsis.cc
+++ b/libstdc++-v3/testsuite/25_algorithms/headers/algorithm/synopsis.cc
@@ -165,10 +165,12 @@ namespace std
// 25.2.2, swap:
#if __cplusplus < 201103L
template<typename _Tp>
+ _GLIBCXX20_CONSTEXPR
void
swap(_Tp&, _Tp& b);
template<typename _Tp, size_t _Nm>
+ _GLIBCXX20_CONSTEXPR
void
swap(_Tp (&)[_Nm], _Tp (&)[_Nm]);
#else
@@ -178,10 +180,12 @@ namespace std
#endif
template<typename _FIter1, typename _FIter2>
+ _GLIBCXX20_CONSTEXPR
_FIter2
swap_ranges(_FIter1 first1, _FIter1, _FIter2);
template<typename _FIter1, typename _FIter2>
+ _GLIBCXX20_CONSTEXPR
void
iter_swap(_FIter1, _FIter2 b);
@@ -295,6 +299,7 @@ namespace std
unique_copy(_IIter, _IIter, _OIter, _BinaryPredicate);
template<typename _BIter>
+ _GLIBCXX20_CONSTEXPR
void
reverse(_BIter, _BIter);
@@ -304,6 +309,7 @@ namespace std
reverse_copy(_BIter, _BIter, _OIter);
template<typename _FIter>
+ _GLIBCXX20_CONSTEXPR
void
rotate(_FIter, _FIter, _FIter);
@@ -322,6 +328,7 @@ namespace std
// 25.2.12, partitions:
template<typename _BIter, typename _Predicate>
+ _GLIBCXX20_CONSTEXPR
_BIter
partition(_BIter, _BIter, _Predicate);
@@ -332,10 +339,12 @@ namespace std
// 25.3, sorting and related operations:
// 25.3.1, sorting:
template<typename _RAIter>
+ _GLIBCXX20_CONSTEXPR
void
sort(_RAIter, _RAIter);
template<typename _RAIter, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
void
sort(_RAIter, _RAIter, _Compare);
@@ -348,26 +357,32 @@ namespace std
stable_sort(_RAIter, _RAIter, _Compare);
template<typename _RAIter>
+ _GLIBCXX20_CONSTEXPR
void
partial_sort(_RAIter, _RAIter, _RAIter);
template<typename _RAIter, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
void
partial_sort(_RAIter, _RAIter, _RAIter, _Compare);
template<typename _IIter, typename _RAIter>
+ _GLIBCXX20_CONSTEXPR
_RAIter
partial_sort_copy(_IIter, _IIter, _RAIter, _RAIter);
template<typename _IIter, typename _RAIter, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
_RAIter
partial_sort_copy(_IIter, _IIter, _RAIter, _RAIter, _Compare);
template<typename _RAIter>
+ _GLIBCXX20_CONSTEXPR
void
nth_element(_RAIter, _RAIter, _RAIter);
template<typename _RAIter, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
void
nth_element(_RAIter, _RAIter, _RAIter, _Compare);
@@ -490,34 +505,42 @@ namespace std
// 25.3.6, heap operations:
template<typename _RAIter>
+ _GLIBCXX20_CONSTEXPR
void
push_heap(_RAIter, _RAIter);
template<typename _RAIter, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
void
push_heap(_RAIter, _RAIter, _Compare);
template<typename _RAIter>
+ _GLIBCXX20_CONSTEXPR
void
pop_heap(_RAIter, _RAIter);
template<typename _RAIter, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
void
pop_heap(_RAIter, _RAIter, _Compare);
template<typename _RAIter>
+ _GLIBCXX20_CONSTEXPR
void
make_heap(_RAIter, _RAIter);
template<typename _RAIter, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
void
make_heap(_RAIter, _RAIter, _Compare);
template<typename _RAIter>
+ _GLIBCXX20_CONSTEXPR
void
sort_heap(_RAIter, _RAIter);
template<typename _RAIter, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
void
sort_heap(_RAIter, _RAIter, _Compare);
@@ -668,18 +691,22 @@ namespace std
// 25.3.9, permutations
template<typename _BIter>
+ _GLIBCXX20_CONSTEXPR
bool
next_permutation(_BIter, _BIter);
template<typename _BIter, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
bool
next_permutation(_BIter, _BIter, _Compare);
template<typename _BIter>
+ _GLIBCXX20_CONSTEXPR
bool
prev_permutation(_BIter, _BIter);
template<typename _BIter, typename _Compare>
+ _GLIBCXX20_CONSTEXPR
bool
prev_permutation(_BIter, _BIter, _Compare);
}
diff --git a/libstdc++-v3/testsuite/25_algorithms/iter_swap/constexpr.cc
b/libstdc++-v3/testsuite/25_algorithms/iter_swap/constexpr.cc
new file mode 100644
index 00000000000..f11271b7976
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/iter_swap/constexpr.cc
@@ -0,0 +1,42 @@
+// Copyright (C) 2019 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do compile { target c++2a } }
+
+#include <algorithm>
+#include <array>
+
+#ifndef __cpp_lib_constexpr_swap_algorithms
+# error "Feature-test macro for constexpr swap algorithms missing"
+#elif __cpp_lib_constexpr_swap_algorithms < 201712L
+# error "Feature-test macro for constexpr swap algorithms has wrong value"
+#endif
+
+constexpr bool
+test()
+{
+ auto ok = true;
+
+ std::array<int, 12> ar0{{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}};
+
+ std::iter_swap(ar0.begin() + 2, ar0.begin() + 5);
+
+ return ok = ar0[2] == 5 && ar0[5] == 2;
+}
+
+static_assert(test());
diff --git a/libstdc++-v3/testsuite/25_algorithms/make_heap/constexpr.cc
b/libstdc++-v3/testsuite/25_algorithms/make_heap/constexpr.cc
new file mode 100644
index 00000000000..1ce994ebf6a
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/make_heap/constexpr.cc
@@ -0,0 +1,47 @@
+// Copyright (C) 2019 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do compile { target c++2a } }
+
+#include <algorithm>
+#include <array>
+
+#ifndef __cpp_lib_constexpr_swap_algorithms
+# error "Feature-test macro for constexpr swap algorithms missing"
+#elif __cpp_lib_constexpr_swap_algorithms < 201712L
+# error "Feature-test macro for constexpr swap algorithms has wrong value"
+#endif
+
+constexpr bool
+test()
+{
+ auto ok = true;
+
+ std::array<int, 23>
+ ah{{0,
+ 1, 2,
+ 3, 4, 5, 6,
+ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22}};
+
+ std::make_heap(ah.begin(), ah.begin() + 17);
+ ok = ok && std::is_heap(ah.begin(), ah.begin() + 17);
+
+ return ok;
+}
+
+static_assert(test());
diff --git a/libstdc++-v3/testsuite/25_algorithms/next_permutation/constexpr.cc
b/libstdc++-v3/testsuite/25_algorithms/next_permutation/constexpr.cc
new file mode 100644
index 00000000000..f463eddf934
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/next_permutation/constexpr.cc
@@ -0,0 +1,42 @@
+// Copyright (C) 2019 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do compile { target c++2a } }
+
+#include <algorithm>
+#include <array>
+
+#ifndef __cpp_lib_constexpr_swap_algorithms
+# error "Feature-test macro for constexpr swap algorithms missing"
+#elif __cpp_lib_constexpr_swap_algorithms < 201712L
+# error "Feature-test macro for constexpr swap algorithms has wrong value"
+#endif
+
+constexpr bool
+test()
+{
+ auto ok = true;
+
+ std::array<int, 12> ar0{{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}};
+
+ std::next_permutation(ar0.begin(), ar0.end());
+
+ return ok = ar0[11] == 10 && ar0[10] == 11;
+}
+
+static_assert(test());
diff --git a/libstdc++-v3/testsuite/25_algorithms/nth_element/constexpr.cc
b/libstdc++-v3/testsuite/25_algorithms/nth_element/constexpr.cc
new file mode 100644
index 00000000000..2e20836ad38
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/nth_element/constexpr.cc
@@ -0,0 +1,47 @@
+// Copyright (C) 2019 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do compile { target c++2a } }
+
+#include <algorithm>
+#include <array>
+
+#ifndef __cpp_lib_constexpr_swap_algorithms
+# error "Feature-test macro for constexpr swap algorithms missing"
+#elif __cpp_lib_constexpr_swap_algorithms < 201712L
+# error "Feature-test macro for constexpr swap algorithms has wrong value"
+#endif
+
+constexpr bool
+test()
+{
+ auto ok = true;
+
+ std::array<int, 12> ar0{{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}};
+
+ std::nth_element(ar0.begin(), ar0.begin() + 5, ar0.end());
+ ok = ok && ar0[5] == 5;
+
+ std::sort(ar0.begin(), ar0.end(), std::greater<>());
+ std::nth_element(ar0.begin(), ar0.begin() + 5, ar0.end(), std::greater<>());
+ ok = ok && ar0[5] == 6;
+
+ return ok;
+}
+
+static_assert(test());
diff --git a/libstdc++-v3/testsuite/25_algorithms/partial_sort/constexpr.cc
b/libstdc++-v3/testsuite/25_algorithms/partial_sort/constexpr.cc
new file mode 100644
index 00000000000..e7d215981c0
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/partial_sort/constexpr.cc
@@ -0,0 +1,46 @@
+// Copyright (C) 2019 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do compile { target c++2a } }
+
+#include <algorithm>
+#include <array>
+
+#ifndef __cpp_lib_constexpr_swap_algorithms
+# error "Feature-test macro for constexpr swap algorithms missing"
+#elif __cpp_lib_constexpr_swap_algorithms < 201712L
+# error "Feature-test macro for constexpr swap algorithms has wrong value"
+#endif
+
+constexpr bool
+test()
+{
+ auto ok = true;
+
+ std::array<int, 12> ar0{{0, 1, 7, 8, 9, 2, 3, 4, 5, 6, 10, 11}};
+
+ std::partial_sort(ar0.begin(), ar0.begin() + 5, ar0.end());
+ ok = ok && ar0[0] == 0 && ar0[4] == 4;
+
+ std::partial_sort(ar0.begin(), ar0.begin() + 5, ar0.end(), std::greater<>());
+ ok = ok && ar0[0] == 11 && ar0[4] == 7;
+
+ return ok;
+}
+
+static_assert(test());
diff --git
a/libstdc++-v3/testsuite/25_algorithms/partial_sort_copy/constexpr.cc
b/libstdc++-v3/testsuite/25_algorithms/partial_sort_copy/constexpr.cc
new file mode 100644
index 00000000000..94e6d2037d0
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/partial_sort_copy/constexpr.cc
@@ -0,0 +1,47 @@
+// Copyright (C) 2019 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do compile { target c++2a } }
+
+#include <algorithm>
+#include <array>
+
+#ifndef __cpp_lib_constexpr_swap_algorithms
+# error "Feature-test macro for constexpr swap algorithms missing"
+#elif __cpp_lib_constexpr_swap_algorithms < 201712L
+# error "Feature-test macro for constexpr swap algorithms has wrong value"
+#endif
+
+constexpr bool
+test()
+{
+ auto ok = true;
+
+ const std::array<int, 12> ar0{{0, 7, 8, 9, 1, 2, 5, 6, 10, 3, 4, 11}};
+ std::array<int, 12> or0{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+
+ std::partial_sort_copy(ar0.begin() + 5, ar0.begin() + 10,
+ or0.begin(), or0.begin() + 5);
+
+ std::partial_sort_copy(ar0.begin() + 5, ar0.begin() + 10,
+ or0.begin(), or0.begin() + 5, std::greater<>());
+
+ return ok;
+}
+
+static_assert(test());
diff --git a/libstdc++-v3/testsuite/25_algorithms/partition/constexpr.cc
b/libstdc++-v3/testsuite/25_algorithms/partition/constexpr.cc
new file mode 100644
index 00000000000..7f525951420
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/partition/constexpr.cc
@@ -0,0 +1,44 @@
+// Copyright (C) 2019 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do compile { target c++2a } }
+
+#include <algorithm>
+#include <array>
+
+#ifndef __cpp_lib_constexpr_swap_algorithms
+# error "Feature-test macro for constexpr swap algorithms missing"
+#elif __cpp_lib_constexpr_swap_algorithms < 201712L
+# error "Feature-test macro for constexpr swap algorithms has wrong value"
+#endif
+
+constexpr bool
+test()
+{
+ auto ok = true;
+
+ std::array<int, 12> ar0{{10, 0, 5, 1, 2, 6, 7, 8, 3, 4, 9, 11}};
+
+ auto iter1 = std::partition(ar0.begin(), ar0.end(),
+ [](int i){ return i < 7; });
+ ok = ok && *iter1 == 8;
+
+ return ok;
+}
+
+static_assert(test());
diff --git a/libstdc++-v3/testsuite/25_algorithms/pop_heap/constexpr.cc
b/libstdc++-v3/testsuite/25_algorithms/pop_heap/constexpr.cc
new file mode 100644
index 00000000000..d1e7f268626
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/pop_heap/constexpr.cc
@@ -0,0 +1,53 @@
+// Copyright (C) 2019 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do compile { target c++2a } }
+
+#include <algorithm>
+#include <array>
+
+#ifndef __cpp_lib_constexpr_swap_algorithms
+# error "Feature-test macro for constexpr swap algorithms missing"
+#elif __cpp_lib_constexpr_swap_algorithms < 201712L
+# error "Feature-test macro for constexpr swap algorithms has wrong value"
+#endif
+
+constexpr bool
+test()
+{
+ auto ok = true;
+
+ std::array<int, 23>
+ ah{{0,
+ 1, 2,
+ 3, 4, 5, 6,
+ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22}};
+
+ std::make_heap(ah.begin(), ah.end());
+ ok = ok && std::is_heap(ah.begin(), ah.end());
+
+ std::pop_heap(ah.begin(), ah.end());
+ std::pop_heap(ah.begin(), ah.end() - 1);
+ std::pop_heap(ah.begin(), ah.end() - 2);
+ ok = ok && std::is_heap(ah.begin(), ah.end() - 3)
+ && !std::is_heap(ah.begin(), ah.end());
+
+ return ok;
+}
+
+static_assert(test());
diff --git a/libstdc++-v3/testsuite/25_algorithms/prev_permutation/constexpr.cc
b/libstdc++-v3/testsuite/25_algorithms/prev_permutation/constexpr.cc
new file mode 100644
index 00000000000..55218e5bb73
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/prev_permutation/constexpr.cc
@@ -0,0 +1,42 @@
+// Copyright (C) 2019 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do compile { target c++2a } }
+
+#include <algorithm>
+#include <array>
+
+#ifndef __cpp_lib_constexpr_swap_algorithms
+# error "Feature-test macro for constexpr swap algorithms missing"
+#elif __cpp_lib_constexpr_swap_algorithms < 201712L
+# error "Feature-test macro for constexpr swap algorithms has wrong value"
+#endif
+
+constexpr bool
+test()
+{
+ auto ok = true;
+
+ std::array<int, 12> ar0{{1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}};
+
+ std::prev_permutation(ar0.begin(), ar0.end());
+
+ return ok = ar0[0] == 0;
+}
+
+static_assert(test());
diff --git a/libstdc++-v3/testsuite/25_algorithms/push_heap/constexpr.cc
b/libstdc++-v3/testsuite/25_algorithms/push_heap/constexpr.cc
new file mode 100644
index 00000000000..ceb14ba6f0a
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/push_heap/constexpr.cc
@@ -0,0 +1,52 @@
+// Copyright (C) 2019 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do compile { target c++2a } }
+
+#include <algorithm>
+#include <array>
+
+#ifndef __cpp_lib_constexpr_swap_algorithms
+# error "Feature-test macro for constexpr swap algorithms missing"
+#elif __cpp_lib_constexpr_swap_algorithms < 201712L
+# error "Feature-test macro for constexpr swap algorithms has wrong value"
+#endif
+
+constexpr bool
+test()
+{
+ auto ok = true;
+
+ std::array<int, 23>
+ ah{{0,
+ 1, 2,
+ 3, 4, 5, 6,
+ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22}};
+
+ std::make_heap(ah.begin(), ah.end() - 3);
+ ok = ok && std::is_heap(ah.begin(), ah.end() - 3);
+
+ std::push_heap(ah.begin(), ah.end() - 2);
+ std::push_heap(ah.begin(), ah.end() - 1);
+ std::push_heap(ah.begin(), ah.end());
+ ok = ok && std::is_heap(ah.begin(), ah.end());
+
+ return ok;
+}
+
+static_assert(test());
diff --git a/libstdc++-v3/testsuite/25_algorithms/reverse/constexpr.cc
b/libstdc++-v3/testsuite/25_algorithms/reverse/constexpr.cc
new file mode 100644
index 00000000000..b55a9faf61e
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/reverse/constexpr.cc
@@ -0,0 +1,41 @@
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do compile { target c++2a } }
+
+#include <algorithm>
+#include <array>
+
+#ifndef __cpp_lib_constexpr_swap_algorithms
+# error "Feature-test macro for constexpr swap algorithms missing"
+#elif __cpp_lib_constexpr_swap_algorithms < 201712L
+# error "Feature-test macro for constexpr swap algorithms has wrong value"
+#endif
+
+constexpr bool
+test()
+{
+ auto ok = true;
+
+ std::array<int, 12> ar0{{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}};
+
+ std::reverse(ar0.begin() + 2, ar0.begin() + 9);
+
+ return ar0[2] == 8 && ar0[8] == 2;
+}
+
+static_assert(test());
diff --git a/libstdc++-v3/testsuite/25_algorithms/rotate/constexpr.cc
b/libstdc++-v3/testsuite/25_algorithms/rotate/constexpr.cc
new file mode 100644
index 00000000000..dbdaac3cdd2
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/rotate/constexpr.cc
@@ -0,0 +1,41 @@
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do compile { target c++2a } }
+
+#include <algorithm>
+#include <array>
+
+#ifndef __cpp_lib_constexpr_swap_algorithms
+# error "Feature-test macro for constexpr swap algorithms missing"
+#elif __cpp_lib_constexpr_swap_algorithms < 201712L
+# error "Feature-test macro for constexpr swap algorithms has wrong value"
+#endif
+
+constexpr bool
+test()
+{
+ auto ok = true;
+
+ std::array<int, 12> ar0{{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}};
+
+ std::rotate(ar0.begin(), ar0.begin() + 5, ar0.end());
+
+ return ar0[0] == 5 && ar0[5] == 10;
+}
+
+static_assert(test());
diff --git a/libstdc++-v3/testsuite/25_algorithms/sort/constexpr.cc
b/libstdc++-v3/testsuite/25_algorithms/sort/constexpr.cc
new file mode 100644
index 00000000000..732747302c9
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/sort/constexpr.cc
@@ -0,0 +1,46 @@
+// Copyright (C) 2019 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do compile { target c++2a } }
+
+#include <algorithm>
+#include <array>
+
+#ifndef __cpp_lib_constexpr_swap_algorithms
+# error "Feature-test macro for constexpr swap algorithms missing"
+#elif __cpp_lib_constexpr_swap_algorithms < 201712L
+# error "Feature-test macro for constexpr swap algorithms has wrong value"
+#endif
+
+constexpr bool
+test()
+{
+ auto ok = true;
+
+ std::array<int, 12> ar0{{10, 0, 1, 2, 5, 6, 7, 8, 3, 4, 9, 11}};
+
+ std::sort(ar0.begin(), ar0.end());
+ ok = ok && std::is_sorted(ar0.begin(), ar0.end());
+
+ std::sort(ar0.begin(), ar0.end(), std::greater<>());
+ ok = ok && std::is_sorted(ar0.begin(), ar0.end(), std::greater<>());
+
+ return ok;
+}
+
+static_assert(test());
diff --git a/libstdc++-v3/testsuite/25_algorithms/sort_heap/constexpr.cc
b/libstdc++-v3/testsuite/25_algorithms/sort_heap/constexpr.cc
new file mode 100644
index 00000000000..8be490307ba
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/sort_heap/constexpr.cc
@@ -0,0 +1,56 @@
+// Copyright (C) 2019 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do compile { target c++2a } }
+
+#include <algorithm>
+#include <array>
+
+#ifndef __cpp_lib_constexpr_swap_algorithms
+# error "Feature-test macro for constexpr swap algorithms missing"
+#elif __cpp_lib_constexpr_swap_algorithms < 201712L
+# error "Feature-test macro for constexpr swap algorithms has wrong value"
+#endif
+
+constexpr bool
+test()
+{
+ auto ok = true;
+
+ std::array<int, 23>
+ ah{{0,
+ 1, 2,
+ 3, 4, 5, 6,
+ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22}};
+
+ std::make_heap(ah.begin(), ah.begin() + 17);
+ ok = ok && std::is_heap(ah.begin(), ah.begin() + 17);
+
+ std::sort_heap(ah.begin(), ah.begin() + 17);
+ ok = ok && std::is_sorted(ah.begin(), ah.begin() + 17);
+
+ std::make_heap(ah.begin(), ah.begin() + 17, std::greater<>());
+ ok = ok && std::is_heap(ah.begin(), ah.begin() + 17, std::greater<>());
+
+ std::sort_heap(ah.begin(), ah.begin() + 17, std::greater<>());
+ ok = ok && std::is_sorted(ah.begin(), ah.begin() + 17, std::greater<>());
+
+ return ok;
+}
+
+static_assert(test());
diff --git a/libstdc++-v3/testsuite/25_algorithms/swap/constexpr.cc
b/libstdc++-v3/testsuite/25_algorithms/swap/constexpr.cc
new file mode 100644
index 00000000000..5e417810ad7
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/swap/constexpr.cc
@@ -0,0 +1,47 @@
+// Copyright (C) 2019 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do compile { target c++2a } }
+
+#include <algorithm>
+
+#ifndef __cpp_lib_constexpr_swap_algorithms
+# error "Feature-test macro for constexpr swap algorithms missing"
+#elif __cpp_lib_constexpr_swap_algorithms < 201712L
+# error "Feature-test macro for constexpr swap algorithms has wrong value"
+#endif
+
+constexpr bool
+test()
+{
+ auto ok = true;
+
+ double asc = 3.1415;
+ double bsc = 2.7182;
+ std::swap(asc, bsc);
+ ok = ok && asc == 2.7182 && bsc == 3.1415;
+
+ float arr[5]{0.0f, 1.0f, 2.0f, 3.0f, 4.0f};
+ float brr[5]{5.0f, 6.0f, 7.0f, 8.0f, 9.0f};
+ std::swap(arr, brr);
+ ok = ok && arr[2] == 7.0f && brr[2] == 2.0f;
+
+ return ok;
+}
+
+static_assert(test());
diff --git a/libstdc++-v3/testsuite/25_algorithms/swap_ranges/constexpr.cc
b/libstdc++-v3/testsuite/25_algorithms/swap_ranges/constexpr.cc
new file mode 100644
index 00000000000..2293e317bba
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/swap_ranges/constexpr.cc
@@ -0,0 +1,44 @@
+// Copyright (C) 2019 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do compile { target c++2a } }
+
+#include <algorithm>
+#include <array>
+
+#ifndef __cpp_lib_constexpr_swap_algorithms
+# error "Feature-test macro for constexpr swap algorithms missing"
+#elif __cpp_lib_constexpr_swap_algorithms < 201712L
+# error "Feature-test macro for constexpr swap algorithms has wrong value"
+#endif
+
+constexpr bool
+test()
+{
+ auto ok = true;
+
+ std::array<int, 12> ar0{{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}};
+ std::array<int, 12> ar1{{11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}};
+
+ const auto out01 = std::swap_ranges(ar0.begin(), ar0.begin() + 5,
+ ar1.begin() + 2);
+
+ return ok = ar0[0] == 9 && ar1[2] == 0;
+}
+
+static_assert(test());