From 7a91c710999d274c188fc0c504732a6f0b9059c1 Mon Sep 17 00:00:00 2001 From: Edward Smith-Rowland <3dw4rd@verizon.net> Date: Wed, 14 Aug 2019 17:54:15 +0000 Subject: [PATCH] Implement C++20 p0879 - Constexpr for swap and swap related functions. 2019-08-14 Edward Smith-Rowland <3dw4rd@verizon.net> Implement C++20 p0879 - Constexpr for swap and swap related functions. * include/std/version (__cpp_lib_constexpr_swap_algorithms): New macro. * 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. From-SVN: r274488 --- libstdc++-v3/ChangeLog | 41 ++++++++++++++ libstdc++-v3/include/bits/algorithmfwd.h | 28 ++++++++++ libstdc++-v3/include/bits/move.h | 2 + libstdc++-v3/include/bits/stl_algo.h | 33 +++++++++++ libstdc++-v3/include/bits/stl_algobase.h | 4 ++ libstdc++-v3/include/bits/stl_heap.h | 13 +++++ libstdc++-v3/include/std/type_traits | 2 + libstdc++-v3/include/std/version | 1 + .../headers/algorithm/synopsis.cc | 27 +++++++++ .../25_algorithms/iter_swap/constexpr.cc | 42 ++++++++++++++ .../25_algorithms/make_heap/constexpr.cc | 47 ++++++++++++++++ .../next_permutation/constexpr.cc | 42 ++++++++++++++ .../25_algorithms/nth_element/constexpr.cc | 47 ++++++++++++++++ .../25_algorithms/partial_sort/constexpr.cc | 46 +++++++++++++++ .../partial_sort_copy/constexpr.cc | 47 ++++++++++++++++ .../25_algorithms/partition/constexpr.cc | 44 +++++++++++++++ .../25_algorithms/pop_heap/constexpr.cc | 53 ++++++++++++++++++ .../prev_permutation/constexpr.cc | 42 ++++++++++++++ .../25_algorithms/push_heap/constexpr.cc | 52 +++++++++++++++++ .../25_algorithms/reverse/constexpr.cc | 41 ++++++++++++++ .../25_algorithms/rotate/constexpr.cc | 41 ++++++++++++++ .../testsuite/25_algorithms/sort/constexpr.cc | 46 +++++++++++++++ .../25_algorithms/sort_heap/constexpr.cc | 56 +++++++++++++++++++ .../testsuite/25_algorithms/swap/constexpr.cc | 47 ++++++++++++++++ .../25_algorithms/swap_ranges/constexpr.cc | 44 +++++++++++++++ 25 files changed, 888 insertions(+) create mode 100644 libstdc++-v3/testsuite/25_algorithms/iter_swap/constexpr.cc create mode 100644 libstdc++-v3/testsuite/25_algorithms/make_heap/constexpr.cc create mode 100644 libstdc++-v3/testsuite/25_algorithms/next_permutation/constexpr.cc create mode 100644 libstdc++-v3/testsuite/25_algorithms/nth_element/constexpr.cc create mode 100644 libstdc++-v3/testsuite/25_algorithms/partial_sort/constexpr.cc create mode 100644 libstdc++-v3/testsuite/25_algorithms/partial_sort_copy/constexpr.cc create mode 100644 libstdc++-v3/testsuite/25_algorithms/partition/constexpr.cc create mode 100644 libstdc++-v3/testsuite/25_algorithms/pop_heap/constexpr.cc create mode 100644 libstdc++-v3/testsuite/25_algorithms/prev_permutation/constexpr.cc create mode 100644 libstdc++-v3/testsuite/25_algorithms/push_heap/constexpr.cc create mode 100644 libstdc++-v3/testsuite/25_algorithms/reverse/constexpr.cc create mode 100644 libstdc++-v3/testsuite/25_algorithms/rotate/constexpr.cc create mode 100644 libstdc++-v3/testsuite/25_algorithms/sort/constexpr.cc create mode 100644 libstdc++-v3/testsuite/25_algorithms/sort_heap/constexpr.cc create mode 100644 libstdc++-v3/testsuite/25_algorithms/swap/constexpr.cc create mode 100644 libstdc++-v3/testsuite/25_algorithms/swap_ranges/constexpr.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index c6f5b1fbdbb..d9908b6d8fd 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,44 @@ +2019-08-14 Edward Smith-Rowland <3dw4rd@verizon.net> + + Implement C++20 p0879 - Constexpr for swap and swap related functions. + * include/std/version (__cpp_lib_constexpr_swap_algorithms): New macro. + * 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. + 2019-08-12 Jonathan Wakely PR libstdc++/90361 diff --git a/libstdc++-v3/include/bits/algorithmfwd.h b/libstdc++-v3/include/bits/algorithmfwd.h index 99491db1c5e..9c511f05197 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 201806L #endif #if __cplusplus >= 201103L @@ -377,6 +378,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #endif template + _GLIBCXX20_CONSTEXPR void iter_swap(_FIter1, _FIter2); @@ -391,10 +393,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION lower_bound(_FIter, _FIter, const _Tp&, _Compare); template + _GLIBCXX20_CONSTEXPR void make_heap(_RAIter, _RAIter); template + _GLIBCXX20_CONSTEXPR void make_heap(_RAIter, _RAIter, _Compare); @@ -478,10 +482,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // mismatch template + _GLIBCXX20_CONSTEXPR bool next_permutation(_BIter, _BIter); template + _GLIBCXX20_CONSTEXPR bool next_permutation(_BIter, _BIter, _Compare); @@ -496,10 +502,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // partial_sort template + _GLIBCXX20_CONSTEXPR _RAIter partial_sort_copy(_IIter, _IIter, _RAIter, _RAIter); template + _GLIBCXX20_CONSTEXPR _RAIter partial_sort_copy(_IIter, _IIter, _RAIter, _RAIter, _Compare); @@ -519,26 +527,32 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #endif template + _GLIBCXX20_CONSTEXPR void pop_heap(_RAIter, _RAIter); template + _GLIBCXX20_CONSTEXPR void pop_heap(_RAIter, _RAIter, _Compare); template + _GLIBCXX20_CONSTEXPR bool prev_permutation(_BIter, _BIter); template + _GLIBCXX20_CONSTEXPR bool prev_permutation(_BIter, _BIter, _Compare); template + _GLIBCXX20_CONSTEXPR void push_heap(_RAIter, _RAIter); template + _GLIBCXX20_CONSTEXPR void push_heap(_RAIter, _RAIter, _Compare); @@ -579,6 +593,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // replace_if template + _GLIBCXX20_CONSTEXPR void reverse(_BIter, _BIter); @@ -590,6 +605,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION inline namespace _V2 { template + _GLIBCXX20_CONSTEXPR _FIter rotate(_FIter, _FIter, _FIter); } @@ -613,10 +629,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #endif template + _GLIBCXX20_CONSTEXPR void sort_heap(_RAIter, _RAIter); template + _GLIBCXX20_CONSTEXPR void sort_heap(_RAIter, _RAIter, _Compare); @@ -628,15 +646,18 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // For C++11 swap() is declared in . template + _GLIBCXX20_CONSTEXPR inline void swap(_Tp& __a, _Tp& __b); template + _GLIBCXX20_CONSTEXPR inline void swap(_Tp (&__a)[_Nm], _Tp (&__b)[_Nm]); #endif template + _GLIBCXX20_CONSTEXPR _FIter2 swap_ranges(_FIter1, _FIter1, _FIter2); @@ -783,22 +804,27 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO mismatch(_IIter1, _IIter1, _IIter2, _BinaryPredicate); template + _GLIBCXX20_CONSTEXPR void nth_element(_RAIter, _RAIter, _RAIter); template + _GLIBCXX20_CONSTEXPR void nth_element(_RAIter, _RAIter, _RAIter, _Compare); template + _GLIBCXX20_CONSTEXPR void partial_sort(_RAIter, _RAIter, _RAIter); template + _GLIBCXX20_CONSTEXPR void partial_sort(_RAIter, _RAIter, _RAIter, _Compare); template + _GLIBCXX20_CONSTEXPR _BIter partition(_BIter, _BIter, _Predicate); @@ -892,10 +918,12 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO set_union(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare); template + _GLIBCXX20_CONSTEXPR void sort(_RAIter, _RAIter); template + _GLIBCXX20_CONSTEXPR void sort(_RAIter, _RAIter, _Compare); diff --git a/libstdc++-v3/include/bits/move.h b/libstdc++-v3/include/bits/move.h index e3ddeb563b4..d7c7068e29c 100644 --- a/libstdc++-v3/include/bits/move.h +++ b/libstdc++-v3/include/bits/move.h @@ -175,6 +175,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * @return Nothing. */ template + _GLIBCXX20_CONSTEXPR inline #if __cplusplus >= 201103L typename enable_if<__and_<__not_<__is_tuple_like<_Tp>>, @@ -199,6 +200,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // DR 809. std::swap should be overloaded for array types. /// Swap the contents of two arrays. template + _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 0d707250d2e..bece93379de 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 + _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 + _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 + _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 + _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 + _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 + _GLIBCXX20_CONSTEXPR _ForwardIterator __rotate(_ForwardIterator __first, _ForwardIterator __middle, @@ -1321,6 +1327,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION /// This is a helper function for the rotate algorithm. template + _GLIBCXX20_CONSTEXPR _BidirectionalIterator __rotate(_BidirectionalIterator __first, _BidirectionalIterator __middle, @@ -1359,6 +1366,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION /// This is a helper function for the rotate algorithm. template + _GLIBCXX20_CONSTEXPR _RandomAccessIterator __rotate(_RandomAccessIterator __first, _RandomAccessIterator __middle, @@ -1465,6 +1473,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * for each @p n in the range @p [0,__last-__first). */ template + _GLIBCXX20_CONSTEXPR inline _ForwardIterator rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last) @@ -1520,6 +1529,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION /// This is a helper function... template + _GLIBCXX20_CONSTEXPR _ForwardIterator __partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, forward_iterator_tag) @@ -1545,6 +1555,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION /// This is a helper function... template + _GLIBCXX20_CONSTEXPR _BidirectionalIterator __partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred, bidirectional_iterator_tag) @@ -1699,6 +1710,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION /// This is a helper function for the sort routines. template + _GLIBCXX20_CONSTEXPR void __heap_select(_RandomAccessIterator __first, _RandomAccessIterator __middle, @@ -1714,6 +1726,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template + _GLIBCXX20_CONSTEXPR _RandomAccessIterator __partial_sort_copy(_InputIterator __first, _InputIterator __last, _RandomAccessIterator __result_first, @@ -1768,6 +1781,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * The value returned is @p __result_first+N. */ template + _GLIBCXX20_CONSTEXPR inline _RandomAccessIterator partial_sort_copy(_InputIterator __first, _InputIterator __last, _RandomAccessIterator __result_first, @@ -1818,6 +1832,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION */ template + _GLIBCXX20_CONSTEXPR inline _RandomAccessIterator partial_sort_copy(_InputIterator __first, _InputIterator __last, _RandomAccessIterator __result_first, @@ -1931,6 +1946,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION /// This is a helper function... template + _GLIBCXX20_CONSTEXPR _RandomAccessIterator __unguarded_partition(_RandomAccessIterator __first, _RandomAccessIterator __last, @@ -1952,6 +1968,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION /// This is a helper function... template + _GLIBCXX20_CONSTEXPR inline _RandomAccessIterator __unguarded_partition_pivot(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) @@ -1963,6 +1980,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template + _GLIBCXX20_CONSTEXPR inline void __partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, @@ -1975,6 +1993,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION /// This is a helper function for the sort routine. template + _GLIBCXX20_CONSTEXPR void __introsort_loop(_RandomAccessIterator __first, _RandomAccessIterator __last, @@ -1998,6 +2017,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // sort template + _GLIBCXX20_CONSTEXPR inline void __sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) @@ -2012,6 +2032,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template + _GLIBCXX20_CONSTEXPR void __introselect(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, _Size __depth_limit, @@ -2728,6 +2749,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template + _GLIBCXX20_CONSTEXPR void __chunk_insertion_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, @@ -2997,6 +3019,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * is the largest of the set, the smallest is generated and false returned. */ template + _GLIBCXX20_CONSTEXPR inline bool next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last) @@ -3029,6 +3052,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * smallest is generated and false returned. */ template + _GLIBCXX20_CONSTEXPR inline bool next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp) @@ -3098,6 +3122,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * returned. */ template + _GLIBCXX20_CONSTEXPR inline bool prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last) @@ -3130,6 +3155,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * the largest is generated and false returned. */ template + _GLIBCXX20_CONSTEXPR inline bool prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp) @@ -4757,6 +4783,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO * @p stable_partition() if this is needed. */ template + _GLIBCXX20_CONSTEXPR inline _ForwardIterator partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) @@ -4790,6 +4817,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO * the range @p [__middle,__last) then *j<*i and *k<*i are both false. */ template + _GLIBCXX20_CONSTEXPR inline void partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, @@ -4828,6 +4856,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO * are both false. */ template + _GLIBCXX20_CONSTEXPR inline void partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, @@ -4864,6 +4893,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO * holds that *j < *i is false. */ template + _GLIBCXX20_CONSTEXPR inline void nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last) @@ -4903,6 +4933,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO * holds that @p __comp(*j,*i) is false. */ template + _GLIBCXX20_CONSTEXPR inline void nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, _Compare __comp) @@ -4940,6 +4971,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO * @p stable_sort() if this is needed. */ template + _GLIBCXX20_CONSTEXPR inline void sort(_RandomAccessIterator __first, _RandomAccessIterator __last) { @@ -4970,6 +5002,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO * @p stable_sort() if this is needed. */ template + _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 ab1ff5185d4..36bb9ccb777 100644 --- a/libstdc++-v3/include/bits/stl_algobase.h +++ b/libstdc++-v3/include/bits/stl_algobase.h @@ -136,6 +136,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION struct __iter_swap { template + _GLIBCXX20_CONSTEXPR static void iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b) { @@ -151,6 +152,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION struct __iter_swap { template + _GLIBCXX20_CONSTEXPR static void iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b) { @@ -170,6 +172,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * iterators themselves. */ template + _GLIBCXX20_CONSTEXPR inline void iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b) { @@ -216,6 +219,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * The ranges must not overlap. */ template + _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 + _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 + _GLIBCXX20_CONSTEXPR inline void push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last) { @@ -190,6 +192,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * performed using comp. */ template + _GLIBCXX20_CONSTEXPR inline void push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) @@ -215,6 +218,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template + _GLIBCXX20_CONSTEXPR void __adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex, _Distance __len, _Tp __value, _Compare __comp) @@ -244,6 +248,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template + _GLIBCXX20_CONSTEXPR inline void __pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _RandomAccessIterator __result, _Compare& __comp) @@ -272,6 +277,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * heap. */ template + _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 + _GLIBCXX20_CONSTEXPR inline void pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) @@ -327,6 +334,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template + _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 + _GLIBCXX20_CONSTEXPR inline void make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last) { @@ -387,6 +396,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * Comparisons are made using __comp. */ template + _GLIBCXX20_CONSTEXPR inline void make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) @@ -403,6 +413,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template + _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 + _GLIBCXX20_CONSTEXPR inline void sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last) { @@ -450,6 +462,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * Comparisons are made using __comp. */ template + _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 9428dadc9d7..b31c26ab381 100644 --- a/libstdc++-v3/include/std/type_traits +++ b/libstdc++-v3/include/std/type_traits @@ -2695,6 +2695,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { }; template + _GLIBCXX20_CONSTEXPR inline typename enable_if<__and_<__not_<__is_tuple_like<_Tp>>, is_move_constructible<_Tp>, @@ -2704,6 +2705,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION is_nothrow_move_assignable<_Tp>>::value); template + _GLIBCXX20_CONSTEXPR inline typename enable_if<__is_swappable<_Tp>::value>::type swap(_Tp (&__a)[_Nm], _Tp (&__b)[_Nm]) diff --git a/libstdc++-v3/include/std/version b/libstdc++-v3/include/std/version index 5757568d639..7f7d05fd8f2 100644 --- a/libstdc++-v3/include/std/version +++ b/libstdc++-v3/include/std/version @@ -154,6 +154,7 @@ #define __cpp_lib_bind_front 201907L #define __cpp_lib_bounded_array_traits 201902L #define __cpp_lib_constexpr_algorithms 201711L +#define __cpp_lib_constexpr_swap_algorithms 201806L #if __cpp_impl_destroying_delete # define __cpp_lib_destroying_delete 201806L #endif 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 + _GLIBCXX20_CONSTEXPR void swap(_Tp&, _Tp& b); template + _GLIBCXX20_CONSTEXPR void swap(_Tp (&)[_Nm], _Tp (&)[_Nm]); #else @@ -178,10 +180,12 @@ namespace std #endif template + _GLIBCXX20_CONSTEXPR _FIter2 swap_ranges(_FIter1 first1, _FIter1, _FIter2); template + _GLIBCXX20_CONSTEXPR void iter_swap(_FIter1, _FIter2 b); @@ -295,6 +299,7 @@ namespace std unique_copy(_IIter, _IIter, _OIter, _BinaryPredicate); template + _GLIBCXX20_CONSTEXPR void reverse(_BIter, _BIter); @@ -304,6 +309,7 @@ namespace std reverse_copy(_BIter, _BIter, _OIter); template + _GLIBCXX20_CONSTEXPR void rotate(_FIter, _FIter, _FIter); @@ -322,6 +328,7 @@ namespace std // 25.2.12, partitions: template + _GLIBCXX20_CONSTEXPR _BIter partition(_BIter, _BIter, _Predicate); @@ -332,10 +339,12 @@ namespace std // 25.3, sorting and related operations: // 25.3.1, sorting: template + _GLIBCXX20_CONSTEXPR void sort(_RAIter, _RAIter); template + _GLIBCXX20_CONSTEXPR void sort(_RAIter, _RAIter, _Compare); @@ -348,26 +357,32 @@ namespace std stable_sort(_RAIter, _RAIter, _Compare); template + _GLIBCXX20_CONSTEXPR void partial_sort(_RAIter, _RAIter, _RAIter); template + _GLIBCXX20_CONSTEXPR void partial_sort(_RAIter, _RAIter, _RAIter, _Compare); template + _GLIBCXX20_CONSTEXPR _RAIter partial_sort_copy(_IIter, _IIter, _RAIter, _RAIter); template + _GLIBCXX20_CONSTEXPR _RAIter partial_sort_copy(_IIter, _IIter, _RAIter, _RAIter, _Compare); template + _GLIBCXX20_CONSTEXPR void nth_element(_RAIter, _RAIter, _RAIter); template + _GLIBCXX20_CONSTEXPR void nth_element(_RAIter, _RAIter, _RAIter, _Compare); @@ -490,34 +505,42 @@ namespace std // 25.3.6, heap operations: template + _GLIBCXX20_CONSTEXPR void push_heap(_RAIter, _RAIter); template + _GLIBCXX20_CONSTEXPR void push_heap(_RAIter, _RAIter, _Compare); template + _GLIBCXX20_CONSTEXPR void pop_heap(_RAIter, _RAIter); template + _GLIBCXX20_CONSTEXPR void pop_heap(_RAIter, _RAIter, _Compare); template + _GLIBCXX20_CONSTEXPR void make_heap(_RAIter, _RAIter); template + _GLIBCXX20_CONSTEXPR void make_heap(_RAIter, _RAIter, _Compare); template + _GLIBCXX20_CONSTEXPR void sort_heap(_RAIter, _RAIter); template + _GLIBCXX20_CONSTEXPR void sort_heap(_RAIter, _RAIter, _Compare); @@ -668,18 +691,22 @@ namespace std // 25.3.9, permutations template + _GLIBCXX20_CONSTEXPR bool next_permutation(_BIter, _BIter); template + _GLIBCXX20_CONSTEXPR bool next_permutation(_BIter, _BIter, _Compare); template + _GLIBCXX20_CONSTEXPR bool prev_permutation(_BIter, _BIter); template + _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..9444bf49041 --- /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 +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do compile { target c++2a } } + +#include +#include + +#ifndef __cpp_lib_constexpr_swap_algorithms +# error "Feature-test macro for constexpr swap algorithms missing" +#elif __cpp_lib_constexpr_swap_algorithms < 201806L +# error "Feature-test macro for constexpr swap algorithms has wrong value" +#endif + +constexpr bool +test() +{ + auto ok = true; + + std::array 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..426310a7317 --- /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 +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do compile { target c++2a } } + +#include +#include + +#ifndef __cpp_lib_constexpr_swap_algorithms +# error "Feature-test macro for constexpr swap algorithms missing" +#elif __cpp_lib_constexpr_swap_algorithms < 201806L +# error "Feature-test macro for constexpr swap algorithms has wrong value" +#endif + +constexpr bool +test() +{ + auto ok = true; + + std::array + 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..4b5c21850fe --- /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 +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do compile { target c++2a } } + +#include +#include + +#ifndef __cpp_lib_constexpr_swap_algorithms +# error "Feature-test macro for constexpr swap algorithms missing" +#elif __cpp_lib_constexpr_swap_algorithms < 201806L +# error "Feature-test macro for constexpr swap algorithms has wrong value" +#endif + +constexpr bool +test() +{ + auto ok = true; + + std::array 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..1c4307478c6 --- /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 +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do compile { target c++2a } } + +#include +#include + +#ifndef __cpp_lib_constexpr_swap_algorithms +# error "Feature-test macro for constexpr swap algorithms missing" +#elif __cpp_lib_constexpr_swap_algorithms < 201806L +# error "Feature-test macro for constexpr swap algorithms has wrong value" +#endif + +constexpr bool +test() +{ + auto ok = true; + + std::array 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..b31be716830 --- /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 +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do compile { target c++2a } } + +#include +#include + +#ifndef __cpp_lib_constexpr_swap_algorithms +# error "Feature-test macro for constexpr swap algorithms missing" +#elif __cpp_lib_constexpr_swap_algorithms < 201806L +# error "Feature-test macro for constexpr swap algorithms has wrong value" +#endif + +constexpr bool +test() +{ + auto ok = true; + + std::array 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..b7f538f4bef --- /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 +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do compile { target c++2a } } + +#include +#include + +#ifndef __cpp_lib_constexpr_swap_algorithms +# error "Feature-test macro for constexpr swap algorithms missing" +#elif __cpp_lib_constexpr_swap_algorithms < 201806L +# error "Feature-test macro for constexpr swap algorithms has wrong value" +#endif + +constexpr bool +test() +{ + auto ok = true; + + const std::array ar0{{0, 7, 8, 9, 1, 2, 5, 6, 10, 3, 4, 11}}; + std::array 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..bd678afd0f5 --- /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 +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do compile { target c++2a } } + +#include +#include + +#ifndef __cpp_lib_constexpr_swap_algorithms +# error "Feature-test macro for constexpr swap algorithms missing" +#elif __cpp_lib_constexpr_swap_algorithms < 201806L +# error "Feature-test macro for constexpr swap algorithms has wrong value" +#endif + +constexpr bool +test() +{ + auto ok = true; + + std::array 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..ff9ca7bb71e --- /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 +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do compile { target c++2a } } + +#include +#include + +#ifndef __cpp_lib_constexpr_swap_algorithms +# error "Feature-test macro for constexpr swap algorithms missing" +#elif __cpp_lib_constexpr_swap_algorithms < 201806L +# error "Feature-test macro for constexpr swap algorithms has wrong value" +#endif + +constexpr bool +test() +{ + auto ok = true; + + std::array + 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..a3a038c743c --- /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 +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do compile { target c++2a } } + +#include +#include + +#ifndef __cpp_lib_constexpr_swap_algorithms +# error "Feature-test macro for constexpr swap algorithms missing" +#elif __cpp_lib_constexpr_swap_algorithms < 201806L +# error "Feature-test macro for constexpr swap algorithms has wrong value" +#endif + +constexpr bool +test() +{ + auto ok = true; + + std::array 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..04b5688d05c --- /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 +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do compile { target c++2a } } + +#include +#include + +#ifndef __cpp_lib_constexpr_swap_algorithms +# error "Feature-test macro for constexpr swap algorithms missing" +#elif __cpp_lib_constexpr_swap_algorithms < 201806L +# error "Feature-test macro for constexpr swap algorithms has wrong value" +#endif + +constexpr bool +test() +{ + auto ok = true; + + std::array + 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..8e1065b50ee --- /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 +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do compile { target c++2a } } + +#include +#include + +#ifndef __cpp_lib_constexpr_swap_algorithms +# error "Feature-test macro for constexpr swap algorithms missing" +#elif __cpp_lib_constexpr_swap_algorithms < 201806L +# error "Feature-test macro for constexpr swap algorithms has wrong value" +#endif + +constexpr bool +test() +{ + auto ok = true; + + std::array 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..b5862876290 --- /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 +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do compile { target c++2a } } + +#include +#include + +#ifndef __cpp_lib_constexpr_swap_algorithms +# error "Feature-test macro for constexpr swap algorithms missing" +#elif __cpp_lib_constexpr_swap_algorithms < 201806L +# error "Feature-test macro for constexpr swap algorithms has wrong value" +#endif + +constexpr bool +test() +{ + auto ok = true; + + std::array 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..7b91b75fce9 --- /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 +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do compile { target c++2a } } + +#include +#include + +#ifndef __cpp_lib_constexpr_swap_algorithms +# error "Feature-test macro for constexpr swap algorithms missing" +#elif __cpp_lib_constexpr_swap_algorithms < 201806L +# error "Feature-test macro for constexpr swap algorithms has wrong value" +#endif + +constexpr bool +test() +{ + auto ok = true; + + std::array 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..fa6e3093542 --- /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 +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do compile { target c++2a } } + +#include +#include + +#ifndef __cpp_lib_constexpr_swap_algorithms +# error "Feature-test macro for constexpr swap algorithms missing" +#elif __cpp_lib_constexpr_swap_algorithms < 201806L +# error "Feature-test macro for constexpr swap algorithms has wrong value" +#endif + +constexpr bool +test() +{ + auto ok = true; + + std::array + 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..7f2d1f8a9f2 --- /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 +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do compile { target c++2a } } + +#include + +#ifndef __cpp_lib_constexpr_swap_algorithms +# error "Feature-test macro for constexpr swap algorithms missing" +#elif __cpp_lib_constexpr_swap_algorithms < 201806L +# 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..a99155bb1da --- /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 +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do compile { target c++2a } } + +#include +#include + +#ifndef __cpp_lib_constexpr_swap_algorithms +# error "Feature-test macro for constexpr swap algorithms missing" +#elif __cpp_lib_constexpr_swap_algorithms < 201806L +# error "Feature-test macro for constexpr swap algorithms has wrong value" +#endif + +constexpr bool +test() +{ + auto ok = true; + + std::array ar0{{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}}; + std::array 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()); -- 2.30.2