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 <3dw...@verizon.net> 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());