diff --git a/libcxx/include/__algorithm/ranges_stable_sort.h b/libcxx/include/__algorithm/ranges_stable_sort.h index 9c7df80ae9872..6e17d0d0c7ec4 100644 --- a/libcxx/include/__algorithm/ranges_stable_sort.h +++ b/libcxx/include/__algorithm/ranges_stable_sort.h @@ -41,7 +41,8 @@ _LIBCPP_BEGIN_NAMESPACE_STD namespace ranges { struct __stable_sort { template - _LIBCPP_HIDE_FROM_ABI static _Iter __stable_sort_fn_impl(_Iter __first, _Sent __last, _Comp& __comp, _Proj& __proj) { + _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR_SINCE_CXX26 _Iter + __stable_sort_fn_impl(_Iter __first, _Sent __last, _Comp& __comp, _Proj& __proj) { auto __last_iter = ranges::next(__first, __last); auto&& __projected_comp = std::__make_projected(__comp, __proj); @@ -52,13 +53,14 @@ struct __stable_sort { template _Sent, class _Comp = ranges::less, class _Proj = identity> requires sortable<_Iter, _Comp, _Proj> - _LIBCPP_HIDE_FROM_ABI _Iter operator()(_Iter __first, _Sent __last, _Comp __comp = {}, _Proj __proj = {}) const { + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 _Iter + operator()(_Iter __first, _Sent __last, _Comp __comp = {}, _Proj __proj = {}) const { return __stable_sort_fn_impl(std::move(__first), std::move(__last), __comp, __proj); } template requires sortable, _Comp, _Proj> - _LIBCPP_HIDE_FROM_ABI borrowed_iterator_t<_Range> + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 borrowed_iterator_t<_Range> operator()(_Range&& __r, _Comp __comp = {}, _Proj __proj = {}) const { return __stable_sort_fn_impl(ranges::begin(__r), ranges::end(__r), __comp, __proj); } diff --git a/libcxx/include/algorithm b/libcxx/include/algorithm index 0c7cea11d1a91..2ec6582adbfc2 100644 --- a/libcxx/include/algorithm +++ b/libcxx/include/algorithm @@ -422,11 +422,12 @@ namespace ranges { template S, class Comp = ranges::less, class Proj = identity> requires sortable - I ranges::stable_sort(I first, S last, Comp comp = {}, Proj proj = {}); // since C++20 + constexpr I // constexpr since C++26 + ranges::stable_sort(I first, S last, Comp comp = {}, Proj proj = {}); // since C++20 template requires sortable, Comp, Proj> - borrowed_iterator_t + constexpr borrowed_iterator_t // constexpr since C++26 ranges::stable_sort(R&& r, Comp comp = {}, Proj proj = {}); // since C++20 template S, class Comp = ranges::less, @@ -1165,84 +1166,84 @@ namespace ranges { } template - constexpr bool // constexpr in C++20 + constexpr bool // constexpr since C++20 all_of(InputIterator first, InputIterator last, Predicate pred); template - constexpr bool // constexpr in C++20 + constexpr bool // constexpr since C++20 any_of(InputIterator first, InputIterator last, Predicate pred); template - constexpr bool // constexpr in C++20 + constexpr bool // constexpr since C++20 none_of(InputIterator first, InputIterator last, Predicate pred); template - constexpr Function // constexpr in C++20 + constexpr Function // constexpr since C++20 for_each(InputIterator first, InputIterator last, Function f); template - constexpr InputIterator // constexpr in C++20 + constexpr InputIterator // constexpr since C++20 for_each_n(InputIterator first, Size n, Function f); // C++17 template - constexpr InputIterator // constexpr in C++20 + constexpr InputIterator // constexpr since C++20 find(InputIterator first, InputIterator last, const T& value); template - constexpr InputIterator // constexpr in C++20 + constexpr InputIterator // constexpr since C++20 find_if(InputIterator first, InputIterator last, Predicate pred); template - constexpr InputIterator // constexpr in C++20 + constexpr InputIterator // constexpr since C++20 find_if_not(InputIterator first, InputIterator last, Predicate pred); template - constexpr ForwardIterator1 // constexpr in C++20 + constexpr ForwardIterator1 // constexpr since C++20 find_end(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2); template - constexpr ForwardIterator1 // constexpr in C++20 + constexpr ForwardIterator1 // constexpr since C++20 find_end(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred); template - constexpr ForwardIterator1 // constexpr in C++20 + constexpr ForwardIterator1 // constexpr since C++20 find_first_of(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2); template - constexpr ForwardIterator1 // constexpr in C++20 + constexpr ForwardIterator1 // constexpr since C++20 find_first_of(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred); template - constexpr ForwardIterator // constexpr in C++20 + constexpr ForwardIterator // constexpr since C++20 adjacent_find(ForwardIterator first, ForwardIterator last); template - constexpr ForwardIterator // constexpr in C++20 + constexpr ForwardIterator // constexpr since C++20 adjacent_find(ForwardIterator first, ForwardIterator last, BinaryPredicate pred); template - constexpr typename iterator_traits::difference_type // constexpr in C++20 + constexpr typename iterator_traits::difference_type // constexpr since C++20 count(InputIterator first, InputIterator last, const T& value); template - constexpr typename iterator_traits::difference_type // constexpr in C++20 + constexpr typename iterator_traits::difference_type // constexpr since C++20 count_if(InputIterator first, InputIterator last, Predicate pred); template - constexpr pair // constexpr in C++20 + constexpr pair // constexpr since C++20 mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2); template constexpr pair mismatch(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, InputIterator2 last2); // since C++14, constexpr in C++20 + InputIterator2 first2, InputIterator2 last2); // since C++14, constexpr since C++20 template - constexpr pair // constexpr in C++20 + constexpr pair // constexpr since C++20 mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate pred); @@ -1250,19 +1251,19 @@ template constexpr pair mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, - BinaryPredicate pred); // since C++14, constexpr in C++20 + BinaryPredicate pred); // since C++14, constexpr since C++20 template - constexpr bool // constexpr in C++20 + constexpr bool // constexpr since C++20 equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2); template constexpr bool equal(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, InputIterator2 last2); // since C++14, constexpr in C++20 + InputIterator2 first2, InputIterator2 last2); // since C++14, constexpr since C++20 template - constexpr bool // constexpr in C++20 + constexpr bool // constexpr since C++20 equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate pred); @@ -1270,20 +1271,20 @@ template constexpr bool equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, - BinaryPredicate pred); // since C++14, constexpr in C++20 + BinaryPredicate pred); // since C++14, constexpr since C++20 template - constexpr bool // constexpr in C++20 + constexpr bool // constexpr since C++20 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2); template constexpr bool is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, - ForwardIterator2 first2, ForwardIterator2 last2); // since C++14, constexpr in C++20 + ForwardIterator2 first2, ForwardIterator2 last2); // since C++14, constexpr since C++20 template - constexpr bool // constexpr in C++20 + constexpr bool // constexpr since C++20 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, BinaryPredicate pred); @@ -1291,42 +1292,42 @@ template constexpr bool is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, - BinaryPredicate pred); // since C++14, constexpr in C++20 + BinaryPredicate pred); // since C++14, constexpr since C++20 template - constexpr ForwardIterator1 // constexpr in C++20 + constexpr ForwardIterator1 // constexpr since C++20 search(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2); template - constexpr ForwardIterator1 // constexpr in C++20 + constexpr ForwardIterator1 // constexpr since C++20 search(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred); template - constexpr ForwardIterator // constexpr in C++20 + constexpr ForwardIterator // constexpr since C++20 search_n(ForwardIterator first, ForwardIterator last, Size count, const T& value); template - constexpr ForwardIterator // constexpr in C++20 + constexpr ForwardIterator // constexpr since C++20 search_n(ForwardIterator first, ForwardIterator last, Size count, const T& value, BinaryPredicate pred); template - constexpr OutputIterator // constexpr in C++20 + constexpr OutputIterator // constexpr since C++20 copy(InputIterator first, InputIterator last, OutputIterator result); template - constexpr OutputIterator // constexpr in C++20 + constexpr OutputIterator // constexpr since C++20 copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred); template - constexpr OutputIterator // constexpr in C++20 + constexpr OutputIterator // constexpr since C++20 copy_n(InputIterator first, Size n, OutputIterator result); template - constexpr BidirectionalIterator2 // constexpr in C++20 + constexpr BidirectionalIterator2 // constexpr since C++20 copy_backward(BidirectionalIterator1 first, BidirectionalIterator1 last, BidirectionalIterator2 result); @@ -1341,7 +1342,7 @@ template BidirectionalIterator2 result); template - constexpr ForwardIterator2 // constexpr in C++20 + constexpr ForwardIterator2 // constexpr since C++20 swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2); namespace ranges { @@ -1360,97 +1361,97 @@ template } template - constexpr void // constexpr in C++20 + constexpr void // constexpr since C++20 iter_swap(ForwardIterator1 a, ForwardIterator2 b); template - constexpr OutputIterator // constexpr in C++20 + constexpr OutputIterator // constexpr since C++20 transform(InputIterator first, InputIterator last, OutputIterator result, UnaryOperation op); template - constexpr OutputIterator // constexpr in C++20 + constexpr OutputIterator // constexpr since C++20 transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, BinaryOperation binary_op); template - constexpr void // constexpr in C++20 + constexpr void // constexpr since C++20 replace(ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value); template - constexpr void // constexpr in C++20 + constexpr void // constexpr since C++20 replace_if(ForwardIterator first, ForwardIterator last, Predicate pred, const T& new_value); template - constexpr OutputIterator // constexpr in C++20 + constexpr OutputIterator // constexpr since C++20 replace_copy(InputIterator first, InputIterator last, OutputIterator result, const T& old_value, const T& new_value); template - constexpr OutputIterator // constexpr in C++20 + constexpr OutputIterator // constexpr since C++20 replace_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred, const T& new_value); template - constexpr void // constexpr in C++20 + constexpr void // constexpr since C++20 fill(ForwardIterator first, ForwardIterator last, const T& value); template - constexpr OutputIterator // constexpr in C++20 + constexpr OutputIterator // constexpr since C++20 fill_n(OutputIterator first, Size n, const T& value); template - constexpr void // constexpr in C++20 + constexpr void // constexpr since C++20 generate(ForwardIterator first, ForwardIterator last, Generator gen); template - constexpr OutputIterator // constexpr in C++20 + constexpr OutputIterator // constexpr since C++20 generate_n(OutputIterator first, Size n, Generator gen); template - constexpr ForwardIterator // constexpr in C++20 + constexpr ForwardIterator // constexpr since C++20 remove(ForwardIterator first, ForwardIterator last, const T& value); template - constexpr ForwardIterator // constexpr in C++20 + constexpr ForwardIterator // constexpr since C++20 remove_if(ForwardIterator first, ForwardIterator last, Predicate pred); template - constexpr OutputIterator // constexpr in C++20 + constexpr OutputIterator // constexpr since C++20 remove_copy(InputIterator first, InputIterator last, OutputIterator result, const T& value); template - constexpr OutputIterator // constexpr in C++20 + constexpr OutputIterator // constexpr since C++20 remove_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred); template - constexpr ForwardIterator // constexpr in C++20 + constexpr ForwardIterator // constexpr since C++20 unique(ForwardIterator first, ForwardIterator last); template - constexpr ForwardIterator // constexpr in C++20 + constexpr ForwardIterator // constexpr since C++20 unique(ForwardIterator first, ForwardIterator last, BinaryPredicate pred); template - constexpr OutputIterator // constexpr in C++20 + constexpr OutputIterator // constexpr since C++20 unique_copy(InputIterator first, InputIterator last, OutputIterator result); template - constexpr OutputIterator // constexpr in C++20 + constexpr OutputIterator // constexpr since C++20 unique_copy(InputIterator first, InputIterator last, OutputIterator result, BinaryPredicate pred); template - constexpr void // constexpr in C++20 + constexpr void // constexpr since C++20 reverse(BidirectionalIterator first, BidirectionalIterator last); template - constexpr OutputIterator // constexpr in C++20 + constexpr OutputIterator // constexpr since C++20 reverse_copy(BidirectionalIterator first, BidirectionalIterator last, OutputIterator result); template - constexpr ForwardIterator // constexpr in C++20 + constexpr ForwardIterator // constexpr since C++20 rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last); template - constexpr OutputIterator // constexpr in C++20 + constexpr OutputIterator // constexpr since C++20 rotate_copy(ForwardIterator first, ForwardIterator middle, ForwardIterator last, OutputIterator result); template @@ -1483,125 +1484,125 @@ template typename iterator_traits::difference_type n); // C++20 template - constexpr bool // constexpr in C++20 + constexpr bool // constexpr since C++20 is_partitioned(InputIterator first, InputIterator last, Predicate pred); template - constexpr ForwardIterator // constexpr in C++20 + constexpr ForwardIterator // constexpr since C++20 partition(ForwardIterator first, ForwardIterator last, Predicate pred); template - constexpr pair // constexpr in C++20 + constexpr pair // constexpr since C++20 partition_copy(InputIterator first, InputIterator last, OutputIterator1 out_true, OutputIterator2 out_false, Predicate pred); template - constexpr ForwardIterator // constexpr in C++26 + constexpr ForwardIterator // constexpr since C++26 stable_partition(ForwardIterator first, ForwardIterator last, Predicate pred); template - constexpr ForwardIterator // constexpr in C++20 + constexpr ForwardIterator // constexpr since C++20 partition_point(ForwardIterator first, ForwardIterator last, Predicate pred); template - constexpr bool // constexpr in C++20 + constexpr bool // constexpr since C++20 is_sorted(ForwardIterator first, ForwardIterator last); template - constexpr bool // constexpr in C++20 + constexpr bool // constexpr since C++20 is_sorted(ForwardIterator first, ForwardIterator last, Compare comp); template - constexpr ForwardIterator // constexpr in C++20 + constexpr ForwardIterator // constexpr since C++20 is_sorted_until(ForwardIterator first, ForwardIterator last); template - constexpr ForwardIterator // constexpr in C++20 + constexpr ForwardIterator // constexpr since C++20 is_sorted_until(ForwardIterator first, ForwardIterator last, Compare comp); template - constexpr void // constexpr in C++20 + constexpr void // constexpr since C++20 sort(RandomAccessIterator first, RandomAccessIterator last); template - constexpr void // constexpr in C++20 + constexpr void // constexpr since C++20 sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp); template - constexpr void // constexpr in C++26 + constexpr void // constexpr since C++26 stable_sort(RandomAccessIterator first, RandomAccessIterator last); template - constexpr void // constexpr in C++26 + constexpr void // constexpr since C++26 stable_sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp); template - constexpr void // constexpr in C++20 + constexpr void // constexpr since C++20 partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last); template - constexpr void // constexpr in C++20 + constexpr void // constexpr since C++20 partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp); template - constexpr RandomAccessIterator // constexpr in C++20 + constexpr RandomAccessIterator // constexpr since C++20 partial_sort_copy(InputIterator first, InputIterator last, RandomAccessIterator result_first, RandomAccessIterator result_last); template - constexpr RandomAccessIterator // constexpr in C++20 + constexpr RandomAccessIterator // constexpr since C++20 partial_sort_copy(InputIterator first, InputIterator last, RandomAccessIterator result_first, RandomAccessIterator result_last, Compare comp); template - constexpr void // constexpr in C++20 + constexpr void // constexpr since C++20 nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last); template - constexpr void // constexpr in C++20 + constexpr void // constexpr since C++20 nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, Compare comp); template - constexpr ForwardIterator // constexpr in C++20 + constexpr ForwardIterator // constexpr since C++20 lower_bound(ForwardIterator first, ForwardIterator last, const T& value); template - constexpr ForwardIterator // constexpr in C++20 + constexpr ForwardIterator // constexpr since C++20 lower_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp); template - constexpr ForwardIterator // constexpr in C++20 + constexpr ForwardIterator // constexpr since C++20 upper_bound(ForwardIterator first, ForwardIterator last, const T& value); template - constexpr ForwardIterator // constexpr in C++20 + constexpr ForwardIterator // constexpr since C++20 upper_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp); template - constexpr pair // constexpr in C++20 + constexpr pair // constexpr since C++20 equal_range(ForwardIterator first, ForwardIterator last, const T& value); template - constexpr pair // constexpr in C++20 + constexpr pair // constexpr since C++20 equal_range(ForwardIterator first, ForwardIterator last, const T& value, Compare comp); template - constexpr bool // constexpr in C++20 + constexpr bool // constexpr since C++20 binary_search(ForwardIterator first, ForwardIterator last, const T& value); template - constexpr bool // constexpr in C++20 + constexpr bool // constexpr since C++20 binary_search(ForwardIterator first, ForwardIterator last, const T& value, Compare comp); template - constexpr OutputIterator // constexpr in C++20 + constexpr OutputIterator // constexpr since C++20 merge(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result); template - constexpr OutputIterator // constexpr in C++20 + constexpr OutputIterator // constexpr since C++20 merge(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); @@ -1614,123 +1615,123 @@ template inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last, Compare comp); template - constexpr bool // constexpr in C++20 + constexpr bool // constexpr since C++20 includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2); template - constexpr bool // constexpr in C++20 + constexpr bool // constexpr since C++20 includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp); template - constexpr OutputIterator // constexpr in C++20 + constexpr OutputIterator // constexpr since C++20 set_union(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result); template - constexpr OutputIterator // constexpr in C++20 + constexpr OutputIterator // constexpr since C++20 set_union(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); template - constexpr OutputIterator // constexpr in C++20 + constexpr OutputIterator // constexpr since C++20 set_intersection(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result); template - constexpr OutputIterator // constexpr in C++20 + constexpr OutputIterator // constexpr since C++20 set_intersection(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); template - constexpr OutputIterator // constexpr in C++20 + constexpr OutputIterator // constexpr since C++20 set_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result); template - constexpr OutputIterator // constexpr in C++20 + constexpr OutputIterator // constexpr since C++20 set_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); template - constexpr OutputIterator // constexpr in C++20 + constexpr OutputIterator // constexpr since C++20 set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result); template - constexpr OutputIterator // constexpr in C++20 + constexpr OutputIterator // constexpr since C++20 set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); template - constexpr void // constexpr in C++20 + constexpr void // constexpr since C++20 push_heap(RandomAccessIterator first, RandomAccessIterator last); template - constexpr void // constexpr in C++20 + constexpr void // constexpr since C++20 push_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp); template - constexpr void // constexpr in C++20 + constexpr void // constexpr since C++20 pop_heap(RandomAccessIterator first, RandomAccessIterator last); template - constexpr void // constexpr in C++20 + constexpr void // constexpr since C++20 pop_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp); template - constexpr void // constexpr in C++20 + constexpr void // constexpr since C++20 make_heap(RandomAccessIterator first, RandomAccessIterator last); template - constexpr void // constexpr in C++20 + constexpr void // constexpr since C++20 make_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp); template - constexpr void // constexpr in C++20 + constexpr void // constexpr since C++20 sort_heap(RandomAccessIterator first, RandomAccessIterator last); template - constexpr void // constexpr in C++20 + constexpr void // constexpr since C++20 sort_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp); template - constexpr bool // constexpr in C++20 + constexpr bool // constexpr since C++20 is_heap(RandomAccessIterator first, RandomAccessiterator last); template - constexpr bool // constexpr in C++20 + constexpr bool // constexpr since C++20 is_heap(RandomAccessIterator first, RandomAccessiterator last, Compare comp); template - constexpr RandomAccessIterator // constexpr in C++20 + constexpr RandomAccessIterator // constexpr since C++20 is_heap_until(RandomAccessIterator first, RandomAccessiterator last); template - constexpr RandomAccessIterator // constexpr in C++20 + constexpr RandomAccessIterator // constexpr since C++20 is_heap_until(RandomAccessIterator first, RandomAccessiterator last, Compare comp); template - constexpr ForwardIterator // constexpr in C++14 + constexpr ForwardIterator // constexpr since C++14 min_element(ForwardIterator first, ForwardIterator last); template - constexpr ForwardIterator // constexpr in C++14 + constexpr ForwardIterator // constexpr since C++14 min_element(ForwardIterator first, ForwardIterator last, Compare comp); template - constexpr const T& // constexpr in C++14 + constexpr const T& // constexpr since C++14 min(const T& a, const T& b); template - constexpr const T& // constexpr in C++14 + constexpr const T& // constexpr since C++14 min(const T& a, const T& b, Compare comp); template - constexpr T // constexpr in C++14 + constexpr T // constexpr since C++14 min(initializer_list t); template - constexpr T // constexpr in C++14 + constexpr T // constexpr since C++14 min(initializer_list t, Compare comp); template @@ -1740,59 +1741,59 @@ template constexpr const T& clamp(const T& v, const T& lo, const T& hi, Compare comp); // C++17 template - constexpr ForwardIterator // constexpr in C++14 + constexpr ForwardIterator // constexpr since C++14 max_element(ForwardIterator first, ForwardIterator last); template - constexpr ForwardIterator // constexpr in C++14 + constexpr ForwardIterator // constexpr since C++14 max_element(ForwardIterator first, ForwardIterator last, Compare comp); template - constexpr const T& // constexpr in C++14 + constexpr const T& // constexpr since C++14 max(const T& a, const T& b); template - constexpr const T& // constexpr in C++14 + constexpr const T& // constexpr since C++14 max(const T& a, const T& b, Compare comp); template - constexpr T // constexpr in C++14 + constexpr T // constexpr since C++14 max(initializer_list t); template - constexpr T // constexpr in C++14 + constexpr T // constexpr since C++14 max(initializer_list t, Compare comp); template - constexpr pair // constexpr in C++14 + constexpr pair // constexpr since C++14 minmax_element(ForwardIterator first, ForwardIterator last); template - constexpr pair // constexpr in C++14 + constexpr pair // constexpr since C++14 minmax_element(ForwardIterator first, ForwardIterator last, Compare comp); template - constexpr pair // constexpr in C++14 + constexpr pair // constexpr since C++14 minmax(const T& a, const T& b); template - constexpr pair // constexpr in C++14 + constexpr pair // constexpr since C++14 minmax(const T& a, const T& b, Compare comp); template - constexpr pair // constexpr in C++14 + constexpr pair // constexpr since C++14 minmax(initializer_list t); template - constexpr pair // constexpr in C++14 + constexpr pair // constexpr since C++14 minmax(initializer_list t, Compare comp); template - constexpr bool // constexpr in C++20 + constexpr bool // constexpr since C++20 lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2); template - constexpr bool // constexpr in C++20 + constexpr bool // constexpr since C++20 lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp); @@ -1809,19 +1810,19 @@ template InputIterator2 first2, InputIterator2 last2); // since C++20 template - constexpr bool // constexpr in C++20 + constexpr bool // constexpr since C++20 next_permutation(BidirectionalIterator first, BidirectionalIterator last); template - constexpr bool // constexpr in C++20 + constexpr bool // constexpr since C++20 next_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp); template - constexpr bool // constexpr in C++20 + constexpr bool // constexpr since C++20 prev_permutation(BidirectionalIterator first, BidirectionalIterator last); template - constexpr bool // constexpr in C++20 + constexpr bool // constexpr since C++20 prev_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp); } // std diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.sort/stable.sort/ranges.stable.sort.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.sort/stable.sort/ranges.stable.sort.pass.cpp index c8f76b20c6825..10e0874b3bc83 100644 --- a/libcxx/test/std/algorithms/alg.sorting/alg.sort/stable.sort/ranges.stable.sort.pass.cpp +++ b/libcxx/test/std/algorithms/alg.sorting/alg.sort/stable.sort/ranges.stable.sort.pass.cpp @@ -13,11 +13,12 @@ // template S, class Comp = ranges::less, // class Proj = identity> // requires sortable -// I ranges::stable_sort(I first, S last, Comp comp = {}, Proj proj = {}); // since C++20 +// constexpr I // constexpr since C++26 +// ranges::stable_sort(I first, S last, Comp comp = {}, Proj proj = {}); // since C++20 // // template // requires sortable, Comp, Proj> -// borrowed_iterator_t +// constexpr borrowed_iterator_t // constexpr since C++26 // ranges::stable_sort(R&& r, Comp comp = {}, Proj proj = {}); // since C++20 #include @@ -57,7 +58,7 @@ static_assert(!HasStableSortR, BadComparator>); static_assert(!HasStableSortR>); // Doesn't satisfy `sortable`. template -void test_one(std::array input, std::array expected) { +TEST_CONSTEXPR_CXX26 void test_one(std::array input, std::array expected) { { // (iterator, sentinel) overload. auto sorted = input; auto b = Iter(sorted.data()); @@ -81,7 +82,7 @@ void test_one(std::array input, std::array expected) { } template -void test_iterators_2() { +TEST_CONSTEXPR_CXX26 void test_iterators_2() { // Empty sequence. test_one({}, {}); // 1-element sequence. @@ -105,25 +106,25 @@ void test_iterators_2() { } template -void test_iterators_1() { +TEST_CONSTEXPR_CXX26 void test_iterators_1() { test_iterators_2(); test_iterators_2>(); } -void test_iterators() { +TEST_CONSTEXPR_CXX26 void test_iterators() { test_iterators_1>(); test_iterators_1>(); test_iterators_1(); } -void test() { +TEST_CONSTEXPR_CXX26 bool test() { test_iterators(); struct OrderedValue { int value; double original_order; bool operator==(const OrderedValue&) const = default; - auto operator<=>(const OrderedValue& rhs) const { return value <=> rhs.value; } + TEST_CONSTEXPR_CXX26 auto operator<=>(const OrderedValue& rhs) const { return value <=> rhs.value; } }; { // The sort is stable (equivalent elements remain in the same order). @@ -214,10 +215,10 @@ void test() { { // `std::invoke` is used in the implementation. struct S { int i; - S(int i_) : i(i_) {} + TEST_CONSTEXPR_CXX26 S(int i_) : i(i_) {} - bool comparator(const S& rhs) const { return i < rhs.i; } - const S& projection() const { return *this; } + TEST_CONSTEXPR_CXX26 bool comparator(const S& rhs) const { return i < rhs.i; } + TEST_CONSTEXPR_CXX26 const S& projection() const { return *this; } bool operator==(const S&) const = default; }; @@ -242,8 +243,6 @@ void test() { std::ranges::stable_sort(std::array{1, 2, 3}); } - // TODO: Enable the tests once the implementation switched to use iter_move/iter_swap - /* { // ProxyIterator { std::array in = {2, 1, 3}; @@ -260,12 +259,15 @@ void test() { assert((in == std::array{1, 2, 3})); } } - */ + + return true; } int main(int, char**) { test(); - // Note: `stable_sort` is not `constexpr`. +#if TEST_STD_VER >= 26 + static_assert(test()); +#endif return 0; } diff --git a/libcxx/test/std/algorithms/ranges_robust_against_dangling.pass.cpp b/libcxx/test/std/algorithms/ranges_robust_against_dangling.pass.cpp index 0624a6c2d49c7..299478da22072 100644 --- a/libcxx/test/std/algorithms/ranges_robust_against_dangling.pass.cpp +++ b/libcxx/test/std/algorithms/ranges_robust_against_dangling.pass.cpp @@ -200,8 +200,12 @@ constexpr bool test_all() { if (!std::is_constant_evaluated()) dangling_1st(std::ranges::stable_partition, in, unary_pred); dangling_1st(std::ranges::sort, in); +#if TEST_STD_VER < 26 if (!std::is_constant_evaluated()) +#endif + { dangling_1st(std::ranges::stable_sort, in); + } dangling_1st(std::ranges::partial_sort, in, mid); dangling_1st(std::ranges::nth_element, in, mid); if (!std::is_constant_evaluated()) diff --git a/libcxx/test/std/algorithms/ranges_robust_against_omitting_invoke.pass.cpp b/libcxx/test/std/algorithms/ranges_robust_against_omitting_invoke.pass.cpp index acd7640b418eb..a01cdf1d3a179 100644 --- a/libcxx/test/std/algorithms/ranges_robust_against_omitting_invoke.pass.cpp +++ b/libcxx/test/std/algorithms/ranges_robust_against_omitting_invoke.pass.cpp @@ -167,8 +167,12 @@ constexpr bool test_all() { if (!std::is_constant_evaluated()) test(std::ranges::stable_partition, in, &Foo::unary_pred, &Bar::val); test(std::ranges::sort, in, &Foo::binary_pred, &Bar::val); +#if TEST_STD_VER < 26 if (!std::is_constant_evaluated()) +#endif + { test(std::ranges::stable_sort, in, &Foo::binary_pred, &Bar::val); + } test_mid(std::ranges::partial_sort, in, mid, &Foo::binary_pred, &Bar::val); test_mid(std::ranges::nth_element, in, mid, &Foo::binary_pred, &Bar::val); if (!std::is_constant_evaluated()) diff --git a/libcxx/test/std/algorithms/ranges_robust_against_proxy_iterators.pass.cpp b/libcxx/test/std/algorithms/ranges_robust_against_proxy_iterators.pass.cpp index ca1433b778751..d85052c51973a 100644 --- a/libcxx/test/std/algorithms/ranges_robust_against_proxy_iterators.pass.cpp +++ b/libcxx/test/std/algorithms/ranges_robust_against_proxy_iterators.pass.cpp @@ -170,8 +170,12 @@ constexpr void run_tests() { if (!std::is_constant_evaluated()) test(std::ranges::stable_partition, in, unary_pred); test(std::ranges::sort, in); +#if TEST_STD_VER < 26 if (!std::is_constant_evaluated()) +#endif + { test(std::ranges::stable_sort, in); + } test_mid(std::ranges::partial_sort, in, mid); test_mid(std::ranges::nth_element, in, mid); if (!std::is_constant_evaluated()) diff --git a/libcxx/test/support/test_iterators.h b/libcxx/test/support/test_iterators.h index 419f1d86730b8..ead8a3e8f87d2 100644 --- a/libcxx/test/support/test_iterators.h +++ b/libcxx/test/support/test_iterators.h @@ -1208,6 +1208,10 @@ struct Proxy { constexpr const T&& getData() const&& { return static_cast(data); } + // Explicitly declare the copy constructor as defaulted to avoid deprecation of the implicitly declared one + // because of the user-provided copy assignment operator. + Proxy(const Proxy&) = default; + template requires std::constructible_from constexpr Proxy(U&& u) : data{std::forward(u)} {}