From c5cde6ecbaa661fd23ad085e9e716e843059b104 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Fri, 24 Jan 2020 12:10:49 -0800 Subject: [PATCH] is_constant_evaluated() is constantly available. (#454) --- stl/inc/algorithm | 63 +++++++++++++++++++++----------------------- stl/inc/numeric | 19 +++++++------ stl/inc/type_traits | 2 -- stl/inc/xutility | 54 ++++++++++++++++++------------------- stl/inc/yvals_core.h | 45 +++++++++++-------------------- 5 files changed, 81 insertions(+), 102 deletions(-) diff --git a/stl/inc/algorithm b/stl/inc/algorithm index 77777c5b4..6d99dd973 100644 --- a/stl/inc/algorithm +++ b/stl/inc/algorithm @@ -673,8 +673,7 @@ _NODISCARD _CONSTEXPR20 _FwdIt partition_point(_FwdIt _First, _FwdIt _Last, _Pr // FUNCTION TEMPLATE _Equal_rev_pred_unchecked #if _HAS_IF_CONSTEXPR template -_NODISCARD _CONSTEXPR20_ICE bool _Equal_rev_pred_unchecked( - _InIt1 _First1, _InIt2 _First2, const _InIt2 _Last2, _Pr _Pred) { +_NODISCARD _CONSTEXPR20 bool _Equal_rev_pred_unchecked(_InIt1 _First1, _InIt2 _First2, const _InIt2 _Last2, _Pr _Pred) { // compare [_First1, ...) to [_First2, _Last2) using _Pred if constexpr (decltype(_Equal_memcmp_is_safe(_First1, _First2, _Pred))::value) { #ifdef __cpp_lib_is_constant_evaluated @@ -728,8 +727,8 @@ bool _Equal_rev_pred_unchecked(const _InIt1 _First1, const _InIt2 _First2, const // FUNCTION TEMPLATE search #if _HAS_IF_CONSTEXPR template -_NODISCARD _CONSTEXPR20_ICE _FwdItHaystack search(_FwdItHaystack _First1, _FwdItHaystack _Last1, - const _FwdItPat _First2, const _FwdItPat _Last2, _Pr _Pred) { // find first [_First2, _Last2) satisfying _Pred +_NODISCARD _CONSTEXPR20 _FwdItHaystack search(_FwdItHaystack _First1, _FwdItHaystack _Last1, const _FwdItPat _First2, + const _FwdItPat _Last2, _Pr _Pred) { // find first [_First2, _Last2) satisfying _Pred _Adl_verify_range(_First1, _Last1); _Adl_verify_range(_First2, _Last2); auto _UFirst1 = _Get_unwrapped(_First1); @@ -828,7 +827,7 @@ _NODISCARD _FwdItHaystack search(_ExPo&& _Exec, const _FwdItHaystack _First1, _F #endif // _HAS_CXX17 template -_NODISCARD _CONSTEXPR20_ICE _FwdItHaystack search( +_NODISCARD _CONSTEXPR20 _FwdItHaystack search( const _FwdItHaystack _First1, const _FwdItHaystack _Last1, const _FwdItPat _First2, const _FwdItPat _Last2) { // find first [_First2, _Last2) match return _STD search(_First1, _Last1, _First2, _Last2, equal_to<>()); @@ -1274,7 +1273,7 @@ _CONSTEXPR20 _FwdIt2 _Swap_ranges_unchecked(_FwdIt1 _First1, const _FwdIt1 _Last #if (defined(_M_IX86) || defined(_M_X64)) && !defined(_M_CEE_PURE) && !defined(_M_HYBRID) template , int> = 0> -_CONSTEXPR20_ICE _Ty* _Swap_ranges_unchecked(_Ty* _First1, _Ty* const _Last1, _Ty* _First2) { +_CONSTEXPR20 _Ty* _Swap_ranges_unchecked(_Ty* _First1, _Ty* const _Last1, _Ty* _First2) { // swap [_First1, _Last1) with [_First2, ...), trivially swappable optimization #ifdef __cpp_lib_is_constant_evaluated if (!_STD is_constant_evaluated()) @@ -1293,7 +1292,7 @@ _CONSTEXPR20_ICE _Ty* _Swap_ranges_unchecked(_Ty* _First1, _Ty* const _Last1, _T #endif // (defined(_M_IX86) || defined(_M_X64)) && !defined(_M_CEE_PURE) && !defined(_M_HYBRID) template -_CONSTEXPR20_ICE _FwdIt2 swap_ranges(const _FwdIt1 _First1, const _FwdIt1 _Last1, _FwdIt2 _First2) { +_CONSTEXPR20 _FwdIt2 swap_ranges(const _FwdIt1 _First1, const _FwdIt1 _Last1, _FwdIt2 _First2) { // swap [_First1, _Last1) with [_First2, ...) _Adl_verify_range(_First1, _Last1); const auto _UFirst1 = _Get_unwrapped(_First1); @@ -1305,7 +1304,7 @@ _CONSTEXPR20_ICE _FwdIt2 swap_ranges(const _FwdIt1 _First1, const _FwdIt1 _Last1 #if _ITERATOR_DEBUG_ARRAY_OVERLOADS template -_CONSTEXPR20_ICE _DestTy* swap_ranges(_FwdIt1 _First1, _FwdIt1 _Last1, _DestTy (&_Dest)[_DestSize]) { +_CONSTEXPR20 _DestTy* swap_ranges(_FwdIt1 _First1, _FwdIt1 _Last1, _DestTy (&_Dest)[_DestSize]) { // swap [_First1, _Last1) with [_Dest, ...), array dest return _STD swap_ranges(_First1, _Last1, _Array_iterator<_DestTy, _DestSize>(_Dest))._Unwrapped(); } @@ -2084,7 +2083,7 @@ _DestTy* reverse_copy(_ExPo&&, _BidIt _First, _BidIt _Last, _DestTy (&_Dest)[_De // FUNCTION TEMPLATE rotate_copy template -_CONSTEXPR20_ICE _OutIt rotate_copy(_FwdIt _First, _FwdIt _Mid, _FwdIt _Last, _OutIt _Dest) { +_CONSTEXPR20 _OutIt rotate_copy(_FwdIt _First, _FwdIt _Mid, _FwdIt _Last, _OutIt _Dest) { // copy rotating [_First, _Last) _Adl_verify_range(_First, _Mid); _Adl_verify_range(_Mid, _Last); @@ -3014,7 +3013,7 @@ _NODISCARD constexpr auto _Idl_dist_add(_Diff1 _Lhs, _Diff2 _Rhs) { } template -_CONSTEXPR20_ICE _OutIt merge(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred) { +_CONSTEXPR20 _OutIt merge(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred) { // copy merging ranges, both using _Pred _Adl_verify_range(_First1, _Last1); _Adl_verify_range(_First2, _Last2); @@ -3056,7 +3055,7 @@ _CONSTEXPR20_ICE _OutIt merge(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _In #if _ITERATOR_DEBUG_ARRAY_OVERLOADS template -_CONSTEXPR20_ICE _DestTy* merge( +_CONSTEXPR20 _DestTy* merge( _InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _InIt2 _Last2, _DestTy (&_Dest)[_DestSize], _Pr _Pred) { // copy merging ranges, both using _Pred, array dest return _STD merge(_First1, _Last1, _First2, _Last2, _Array_iterator<_DestTy, _DestSize>(_Dest), _Pass_fn(_Pred)) @@ -3065,15 +3064,14 @@ _CONSTEXPR20_ICE _DestTy* merge( #endif // _ITERATOR_DEBUG_ARRAY_OVERLOADS template -_CONSTEXPR20_ICE _OutIt merge(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest) { +_CONSTEXPR20 _OutIt merge(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest) { // copy merging ranges, both using operator< return _STD merge(_First1, _Last1, _First2, _Last2, _Dest, less<>()); } #if _ITERATOR_DEBUG_ARRAY_OVERLOADS template -_CONSTEXPR20_ICE _DestTy* merge( - _InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _InIt2 _Last2, _DestTy (&_Dest)[_DestSize]) { +_CONSTEXPR20 _DestTy* merge(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _InIt2 _Last2, _DestTy (&_Dest)[_DestSize]) { // copy merging ranges, both using operator<, array dest return _STD merge(_First1, _Last1, _First2, _Last2, _Dest, less<>()); } @@ -3394,7 +3392,7 @@ void inplace_merge(_ExPo&&, _BidIt _First, _BidIt _Mid, _BidIt _Last) noexcept / // FUNCTION TEMPLATE sort template -_CONSTEXPR20_ICE _BidIt _Insertion_sort_unchecked(_BidIt _First, const _BidIt _Last, _Pr _Pred) { +_CONSTEXPR20 _BidIt _Insertion_sort_unchecked(_BidIt _First, const _BidIt _Last, _Pr _Pred) { // insertion sort [_First, _Last), using _Pred if (_First != _Last) { for (_BidIt _Next = _First; ++_Next != _Last;) { // order next element @@ -3518,7 +3516,7 @@ _CONSTEXPR20 pair<_RanIt, _RanIt> _Partition_by_median_guess_unchecked(_RanIt _F } template -_CONSTEXPR20_ICE void _Sort_unchecked(_RanIt _First, _RanIt _Last, _Iter_diff_t<_RanIt> _Ideal, _Pr _Pred) { +_CONSTEXPR20 void _Sort_unchecked(_RanIt _First, _RanIt _Last, _Iter_diff_t<_RanIt> _Ideal, _Pr _Pred) { // order [_First, _Last), using _Pred _Iter_diff_t<_RanIt> _Count = 0; while (_ISORT_MAX < (_Count = _Last - _First) && 0 < _Ideal) { // divide and conquer by quicksort @@ -3544,7 +3542,7 @@ _CONSTEXPR20_ICE void _Sort_unchecked(_RanIt _First, _RanIt _Last, _Iter_diff_t< } template -_CONSTEXPR20_ICE void sort(const _RanIt _First, const _RanIt _Last, _Pr _Pred) { // order [_First, _Last), using _Pred +_CONSTEXPR20 void sort(const _RanIt _First, const _RanIt _Last, _Pr _Pred) { // order [_First, _Last), using _Pred _Adl_verify_range(_First, _Last); const auto _UFirst = _Get_unwrapped(_First); const auto _ULast = _Get_unwrapped(_Last); @@ -3552,7 +3550,7 @@ _CONSTEXPR20_ICE void sort(const _RanIt _First, const _RanIt _Last, _Pr _Pred) { } template -_CONSTEXPR20_ICE void sort(const _RanIt _First, const _RanIt _Last) { // order [_First, _Last), using operator< +_CONSTEXPR20 void sort(const _RanIt _First, const _RanIt _Last) { // order [_First, _Last), using operator< _STD sort(_First, _Last, less<>()); } @@ -3873,7 +3871,7 @@ _RanIt partial_sort_copy( // FUNCTION TEMPLATE nth_element template -_CONSTEXPR20_ICE void nth_element(_RanIt _First, _RanIt _Nth, _RanIt _Last, _Pr _Pred) { +_CONSTEXPR20 void nth_element(_RanIt _First, _RanIt _Nth, _RanIt _Last, _Pr _Pred) { // order Nth element, using _Pred _Adl_verify_range(_First, _Nth); _Adl_verify_range(_Nth, _Last); @@ -3900,7 +3898,7 @@ _CONSTEXPR20_ICE void nth_element(_RanIt _First, _RanIt _Nth, _RanIt _Last, _Pr } template -_CONSTEXPR20_ICE void nth_element(_RanIt _First, _RanIt _Nth, _RanIt _Last) { // order Nth element, using operator< +_CONSTEXPR20 void nth_element(_RanIt _First, _RanIt _Nth, _RanIt _Last) { // order Nth element, using operator< _STD nth_element(_First, _Nth, _Last, less<>()); } @@ -3976,8 +3974,7 @@ _NODISCARD bool includes( // FUNCTION TEMPLATE set_union template -_CONSTEXPR20_ICE _OutIt set_union( - _InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred) { +_CONSTEXPR20 _OutIt set_union(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred) { // OR sets [_First1, _Last1) and [_First2, _Last2), using _Pred _Adl_verify_range(_First1, _Last1); _Adl_verify_range(_First2, _Last2); @@ -4009,7 +4006,7 @@ _CONSTEXPR20_ICE _OutIt set_union( #if _ITERATOR_DEBUG_ARRAY_OVERLOADS template -_CONSTEXPR20_ICE _DestTy* set_union( +_CONSTEXPR20 _DestTy* set_union( _InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _InIt2 _Last2, _DestTy (&_Dest)[_DestSize], _Pr _Pred) { // OR sets [_First1, _Last1) and [_First2, _Last2), array dest return _STD set_union(_First1, _Last1, _First2, _Last2, _Array_iterator<_DestTy, _DestSize>(_Dest), _Pass_fn(_Pred)) @@ -4018,14 +4015,14 @@ _CONSTEXPR20_ICE _DestTy* set_union( #endif // _ITERATOR_DEBUG_ARRAY_OVERLOADS template -_CONSTEXPR20_ICE _OutIt set_union(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest) { +_CONSTEXPR20 _OutIt set_union(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest) { // OR sets [_First1, _Last1) and [_First2, _Last2), using operator< return _STD set_union(_First1, _Last1, _First2, _Last2, _Dest, less<>()); } #if _ITERATOR_DEBUG_ARRAY_OVERLOADS template -_CONSTEXPR20_ICE _DestTy* set_union( +_CONSTEXPR20 _DestTy* set_union( _InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _InIt2 _Last2, _DestTy (&_Dest)[_DestSize]) { // OR sets [_First1, _Last1) and [_First2, _Last2), array dest return _STD set_union(_First1, _Last1, _First2, _Last2, _Dest, less<>()); @@ -4176,7 +4173,7 @@ _DestTy* set_intersection(_ExPo&& _Exec, _FwdIt1 _First1, _FwdIt1 _Last1, _FwdIt // FUNCTION TEMPLATE set_difference template -_CONSTEXPR20_ICE _OutIt set_difference( +_CONSTEXPR20 _OutIt set_difference( _InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred) { // take set [_First2, _Last2) from [_First1, _Last1), using _Pred _Adl_verify_range(_First1, _Last1); @@ -4208,7 +4205,7 @@ _CONSTEXPR20_ICE _OutIt set_difference( #if _ITERATOR_DEBUG_ARRAY_OVERLOADS template -_CONSTEXPR20_ICE _DestTy* set_difference( +_CONSTEXPR20 _DestTy* set_difference( _InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _InIt2 _Last2, _DestTy (&_Dest)[_DestSize], _Pr _Pred) { // take set [_First2, _Last2) from [_First1, _Last1), array dest return _STD set_difference( @@ -4218,14 +4215,14 @@ _CONSTEXPR20_ICE _DestTy* set_difference( #endif // _ITERATOR_DEBUG_ARRAY_OVERLOADS template -_CONSTEXPR20_ICE _OutIt set_difference(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest) { +_CONSTEXPR20 _OutIt set_difference(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest) { // take set [_First2, _Last2) from [_First1, _Last1), using operator< return _STD set_difference(_First1, _Last1, _First2, _Last2, _Dest, less<>()); } #if _ITERATOR_DEBUG_ARRAY_OVERLOADS template -_CONSTEXPR20_ICE _DestTy* set_difference( +_CONSTEXPR20 _DestTy* set_difference( _InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _InIt2 _Last2, _DestTy (&_Dest)[_DestSize]) { // take set [_First2, _Last2) from [_First1, _Last1), array dest return _STD set_difference(_First1, _Last1, _First2, _Last2, _Dest, less<>()); @@ -4269,7 +4266,7 @@ _DestTy* set_difference(_ExPo&& _Exec, _FwdIt1 _First1, _FwdIt1 _Last1, _FwdIt2 // FUNCTION TEMPLATE set_symmetric_difference template -_CONSTEXPR20_ICE _OutIt set_symmetric_difference( +_CONSTEXPR20 _OutIt set_symmetric_difference( _InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred) { // XOR sets [_First1, _Last1) and [_First2, _Last2), using _Pred _Adl_verify_range(_First1, _Last1); @@ -4303,7 +4300,7 @@ _CONSTEXPR20_ICE _OutIt set_symmetric_difference( #if _ITERATOR_DEBUG_ARRAY_OVERLOADS template -_CONSTEXPR20_ICE _DestTy* set_symmetric_difference( +_CONSTEXPR20 _DestTy* set_symmetric_difference( _InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _InIt2 _Last2, _DestTy (&_Dest)[_DestSize], _Pr _Pred) { // XOR sets [_First1, _Last1) and [_First2, _Last2), array dest return _STD set_symmetric_difference( @@ -4313,7 +4310,7 @@ _CONSTEXPR20_ICE _DestTy* set_symmetric_difference( #endif // _ITERATOR_DEBUG_ARRAY_OVERLOADS template -_CONSTEXPR20_ICE _OutIt set_symmetric_difference( +_CONSTEXPR20 _OutIt set_symmetric_difference( _InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest) { // XOR sets [_First1, _Last1) and [_First2, _Last2), using operator< return _STD set_symmetric_difference(_First1, _Last1, _First2, _Last2, _Dest, less<>()); @@ -4321,7 +4318,7 @@ _CONSTEXPR20_ICE _OutIt set_symmetric_difference( #if _ITERATOR_DEBUG_ARRAY_OVERLOADS template -_CONSTEXPR20_ICE _DestTy* set_symmetric_difference( +_CONSTEXPR20 _DestTy* set_symmetric_difference( _InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _InIt2 _Last2, _DestTy (&_Dest)[_DestSize]) { // XOR sets [_First1, _Last1) and [_First2, _Last2), array dest return _STD set_symmetric_difference(_First1, _Last1, _First2, _Last2, _Dest, less<>()); diff --git a/stl/inc/numeric b/stl/inc/numeric index c22b937d5..db253e0e5 100644 --- a/stl/inc/numeric +++ b/stl/inc/numeric @@ -70,7 +70,7 @@ inline constexpr bool _Plus_on_arithmetic_ranges_reduction_v = false; #endif // _STD_VECTORIZE_WITH_FLOAT_CONTROL template -_NODISCARD _CONSTEXPR20_ICE _Ty reduce(const _InIt _First, const _InIt _Last, _Ty _Val, _BinOp _Reduce_op) { +_NODISCARD _CONSTEXPR20 _Ty reduce(const _InIt _First, const _InIt _Last, _Ty _Val, _BinOp _Reduce_op) { // return commutative and associative reduction of _Val and [_First, _Last), using _Reduce_op _Adl_verify_range(_First, _Last); auto _UFirst = _Get_unwrapped(_First); @@ -78,7 +78,7 @@ _NODISCARD _CONSTEXPR20_ICE _Ty reduce(const _InIt _First, const _InIt _Last, _T if constexpr (_Plus_on_arithmetic_ranges_reduction_v<_Unwrapped_t, _Ty, _BinOp>) { #ifdef __cpp_lib_is_constant_evaluated if (!_STD is_constant_evaluated()) -#endif +#endif // __cpp_lib_is_constant_evaluated { (void) _Reduce_op; // TRANSITION, VSO-486357 return _Reduce_plus_arithmetic_ranges(_UFirst, _ULast, _Val); @@ -93,13 +93,13 @@ _NODISCARD _CONSTEXPR20_ICE _Ty reduce(const _InIt _First, const _InIt _Last, _T } template -_NODISCARD _CONSTEXPR20_ICE _Ty reduce(const _InIt _First, const _InIt _Last, _Ty _Val) { +_NODISCARD _CONSTEXPR20 _Ty reduce(const _InIt _First, const _InIt _Last, _Ty _Val) { // return commutative and associative reduction of _Val and [_First, _Last) return _STD reduce(_First, _Last, _STD move(_Val), plus<>{}); } template -_NODISCARD _CONSTEXPR20_ICE _Iter_value_t<_InIt> reduce(const _InIt _First, const _InIt _Last) { +_NODISCARD _CONSTEXPR20 _Iter_value_t<_InIt> reduce(const _InIt _First, const _InIt _Last) { // return commutative and associative reduction of // iterator_traits<_InIt>::value_type{} and [_First, _Last) return _STD reduce(_First, _Last, _Iter_value_t<_InIt>{}, plus<>{}); @@ -198,7 +198,7 @@ inline constexpr bool _Default_ops_transform_reduce_v = false; #endif // _STD_VECTORIZE_WITH_FLOAT_CONTROL template -_NODISCARD _CONSTEXPR20_ICE _Ty transform_reduce( +_NODISCARD _CONSTEXPR20 _Ty transform_reduce( _InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Ty _Val, _BinOp1 _Reduce_op, _BinOp2 _Transform_op) { // return commutative and associative transform-reduction of sequences, using // _Reduce_op and _Transform_op @@ -227,8 +227,8 @@ _NODISCARD _CONSTEXPR20_ICE _Ty transform_reduce( #if _ITERATOR_DEBUG_ARRAY_OVERLOADS template -_NODISCARD _CONSTEXPR20_ICE _Ty transform_reduce(const _InIt1 _First1, const _InIt1 _Last1, - _RightTy (&_First2)[_RightSize], _Ty _Val, _BinOp1 _Reduce_op, _BinOp2 _Transform_op) { +_NODISCARD _CONSTEXPR20 _Ty transform_reduce(const _InIt1 _First1, const _InIt1 _Last1, _RightTy (&_First2)[_RightSize], + _Ty _Val, _BinOp1 _Reduce_op, _BinOp2 _Transform_op) { // return commutative and associative transform-reduction of // sequences, using _Reduce_op and _Transform_op return _STD transform_reduce(_First1, _Last1, _Array_iterator<_RightTy, _RightSize>(_First2), _STD move(_Val), @@ -237,15 +237,14 @@ _NODISCARD _CONSTEXPR20_ICE _Ty transform_reduce(const _InIt1 _First1, const _In #endif // _ITERATOR_DEBUG_ARRAY_OVERLOADS template -_NODISCARD _CONSTEXPR20_ICE _Ty transform_reduce(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Ty _Val) { +_NODISCARD _CONSTEXPR20 _Ty transform_reduce(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Ty _Val) { // return commutative and associative transform-reduction of sequences return _STD transform_reduce(_First1, _Last1, _First2, _STD move(_Val), plus<>{}, multiplies<>{}); } #if _ITERATOR_DEBUG_ARRAY_OVERLOADS template -_NODISCARD _CONSTEXPR20_ICE _Ty transform_reduce( - _InIt1 _First1, _InIt1 _Last1, _RightTy (&_First2)[_RightSize], _Ty _Val) { +_NODISCARD _CONSTEXPR20 _Ty transform_reduce(_InIt1 _First1, _InIt1 _Last1, _RightTy (&_First2)[_RightSize], _Ty _Val) { // return commutative and associative transform-reduction of sequences return _STD transform_reduce(_First1, _Last1, _First2, _STD move(_Val), plus<>{}, multiplies<>{}); } diff --git a/stl/inc/type_traits b/stl/inc/type_traits index 0826981d5..04a7e1f84 100644 --- a/stl/inc/type_traits +++ b/stl/inc/type_traits @@ -1781,12 +1781,10 @@ inline constexpr bool is_nothrow_invocable_r_v = #endif // _HAS_CXX17 #if _HAS_CXX20 -#ifdef __cpp_lib_is_constant_evaluated // TRANSITION, VS 2019 16.5 Preview 2 // FUNCTION is_constant_evaluated _NODISCARD constexpr bool is_constant_evaluated() noexcept { return __builtin_is_constant_evaluated(); } -#endif // __cpp_lib_is_constant_evaluated #endif // _HAS_CXX20 // STRUCT TEMPLATE _Weak_types diff --git a/stl/inc/xutility b/stl/inc/xutility index 9945bc013..8efecdc06 100644 --- a/stl/inc/xutility +++ b/stl/inc/xutility @@ -3598,7 +3598,7 @@ _OutIt _Copy_memmove(move_iterator<_InIt> _First, move_iterator<_InIt> _Last, _O #if _HAS_IF_CONSTEXPR template -_CONSTEXPR20_ICE _OutIt _Copy_unchecked(_InIt _First, _InIt _Last, _OutIt _Dest) { +_CONSTEXPR20 _OutIt _Copy_unchecked(_InIt _First, _InIt _Last, _OutIt _Dest) { // copy [_First, _Last) to [_Dest, ...) // note: _Copy_unchecked has callers other than the copy family if constexpr (_Ptr_copy_cat<_InIt, _OutIt>::_Trivially_copyable) { @@ -3642,7 +3642,7 @@ _OutIt _Copy_unchecked(_InIt _First, _InIt _Last, _OutIt _Dest) { #endif // _HAS_IF_CONSTEXPR template -_CONSTEXPR20_ICE _OutIt copy(_InIt _First, _InIt _Last, _OutIt _Dest) { // copy [_First, _Last) to [_Dest, ...) +_CONSTEXPR20 _OutIt copy(_InIt _First, _InIt _Last, _OutIt _Dest) { // copy [_First, _Last) to [_Dest, ...) _Adl_verify_range(_First, _Last); const auto _UFirst = _Get_unwrapped(_First); const auto _ULast = _Get_unwrapped(_Last); @@ -3653,7 +3653,7 @@ _CONSTEXPR20_ICE _OutIt copy(_InIt _First, _InIt _Last, _OutIt _Dest) { // copy #if _ITERATOR_DEBUG_ARRAY_OVERLOADS template -_CONSTEXPR20_ICE _DestTy* copy(_InIt _First, _InIt _Last, _DestTy (&_Dest)[_DestSize]) { +_CONSTEXPR20 _DestTy* copy(_InIt _First, _InIt _Last, _DestTy (&_Dest)[_DestSize]) { // copy [_First, _Last) to [_Dest, ...) return _STD copy(_First, _Last, _Array_iterator<_DestTy, _DestSize>(_Dest))._Unwrapped(); } @@ -3683,7 +3683,7 @@ _DestTy* copy(_ExPo&&, _FwdIt1 _First, _FwdIt1 _Last, _DestTy (&_Dest)[_DestSize // FUNCTION TEMPLATE copy_n #if _HAS_IF_CONSTEXPR template -_CONSTEXPR20_ICE _OutIt copy_n(_InIt _First, _Diff _Count_raw, _OutIt _Dest) { +_CONSTEXPR20 _OutIt copy_n(_InIt _First, _Diff _Count_raw, _OutIt _Dest) { // copy [_First, _First + _Count) to [_Dest, ...) _Algorithm_int_t<_Diff> _Count = _Count_raw; if (0 < _Count) { @@ -3760,7 +3760,7 @@ _OutIt copy_n(_InIt _First, _Diff _Count_raw, _OutIt _Dest) { // copy [_First, _ #if _ITERATOR_DEBUG_ARRAY_OVERLOADS template -_CONSTEXPR20_ICE _OutIt copy_n(_SourceTy (&_First)[_SourceSize], _Diff _Count_raw, _OutIt _Dest) { +_CONSTEXPR20 _OutIt copy_n(_SourceTy (&_First)[_SourceSize], _Diff _Count_raw, _OutIt _Dest) { // copy [_First, _First + _Count) to [_Dest, ...), array source const _Algorithm_int_t<_Diff> _Count = _Count_raw; if (0 < _Count) { @@ -3772,7 +3772,7 @@ _CONSTEXPR20_ICE _OutIt copy_n(_SourceTy (&_First)[_SourceSize], _Diff _Count_ra } template -_CONSTEXPR20_ICE _DestTy* copy_n(_InIt _First, _Diff _Count_raw, _DestTy (&_Dest)[_DestSize]) { +_CONSTEXPR20 _DestTy* copy_n(_InIt _First, _Diff _Count_raw, _DestTy (&_Dest)[_DestSize]) { // copy [_First, _First + _Count) to [_Dest, ...), array dest const _Algorithm_int_t<_Diff> _Count = _Count_raw; if (0 < _Count) { @@ -3784,7 +3784,7 @@ _CONSTEXPR20_ICE _DestTy* copy_n(_InIt _First, _Diff _Count_raw, _DestTy (&_Dest } template -_CONSTEXPR20_ICE _DestTy* copy_n(_SourceTy (&_First)[_SourceSize], _Diff _Count_raw, _DestTy (&_Dest)[_DestSize]) { +_CONSTEXPR20 _DestTy* copy_n(_SourceTy (&_First)[_SourceSize], _Diff _Count_raw, _DestTy (&_Dest)[_DestSize]) { // copy [_First, _First + _Count) to [_Dest, ...), array source/dest const _Algorithm_int_t<_Diff> _Count = _Count_raw; if (0 < _Count) { @@ -3855,7 +3855,7 @@ _BidIt2 _Copy_backward_memmove(move_iterator<_BidIt1> _First, move_iterator<_Bid #if _HAS_IF_CONSTEXPR template -_CONSTEXPR20_ICE _BidIt2 copy_backward(_BidIt1 _First, _BidIt1 _Last, _BidIt2 _Dest) { +_CONSTEXPR20 _BidIt2 copy_backward(_BidIt1 _First, _BidIt1 _Last, _BidIt2 _Dest) { // copy [_First, _Last) backwards to [..., _Dest) _Adl_verify_range(_First, _Last); const auto _UFirst = _Get_unwrapped(_First); @@ -3919,7 +3919,7 @@ _BidIt2 copy_backward(_ExPo&&, _BidIt1 _First, _BidIt1 _Last, _BidIt2 _Dest) noe // FUNCTION TEMPLATE move #if _HAS_IF_CONSTEXPR template -_CONSTEXPR20_ICE _OutIt _Move_unchecked(_InIt _First, _InIt _Last, _OutIt _Dest) { +_CONSTEXPR20 _OutIt _Move_unchecked(_InIt _First, _InIt _Last, _OutIt _Dest) { // move [_First, _Last) to [_Dest, ...) // note: _Move_unchecked has callers other than the move family if constexpr (_Ptr_move_cat<_InIt, _OutIt>::_Trivially_copyable) { @@ -3963,7 +3963,7 @@ _OutIt _Move_unchecked(_InIt _First, _InIt _Last, _OutIt _Dest) { #endif // _HAS_IF_CONSTEXPR template -_CONSTEXPR20_ICE _OutIt move(_InIt _First, _InIt _Last, _OutIt _Dest) { +_CONSTEXPR20 _OutIt move(_InIt _First, _InIt _Last, _OutIt _Dest) { // move [_First, _Last) to [_Dest, ...) _Adl_verify_range(_First, _Last); const auto _UFirst = _Get_unwrapped(_First); @@ -4004,7 +4004,7 @@ _DestTy* move(_ExPo&&, _FwdIt1 _First, _FwdIt1 _Last, _DestTy (&_Dest)[_DestSize // FUNCTION TEMPLATE move_backward #if _HAS_IF_CONSTEXPR template -_CONSTEXPR20_ICE _BidIt2 _Move_backward_unchecked(_BidIt1 _First, _BidIt1 _Last, _BidIt2 _Dest) { +_CONSTEXPR20 _BidIt2 _Move_backward_unchecked(_BidIt1 _First, _BidIt1 _Last, _BidIt2 _Dest) { // move [_First, _Last) backwards to [..., _Dest) // note: _Move_backward_unchecked has callers other than the move_backward family if constexpr (_Ptr_move_cat<_BidIt1, _BidIt2>::_Trivially_copyable) { @@ -4049,7 +4049,7 @@ _BidIt2 _Move_backward_unchecked(_BidIt1 _First, _BidIt1 _Last, _BidIt2 _Dest) { #endif // _HAS_IF_CONSTEXPR template -_CONSTEXPR20_ICE _BidIt2 move_backward(_BidIt1 _First, _BidIt1 _Last, _BidIt2 _Dest) { +_CONSTEXPR20 _BidIt2 move_backward(_BidIt1 _First, _BidIt1 _Last, _BidIt2 _Dest) { // move [_First, _Last) backwards to [..., _Dest) _Adl_verify_range(_First, _Last); const auto _UFirst = _Get_unwrapped(_First); @@ -4110,7 +4110,7 @@ _INLINE_VAR constexpr bool _Fill_memset_is_safe<_FwdIt, _Ty, false> = false; #if _HAS_IF_CONSTEXPR template -_CONSTEXPR20_ICE void fill(const _FwdIt _First, const _FwdIt _Last, const _Ty& _Val) { +_CONSTEXPR20 void fill(const _FwdIt _First, const _FwdIt _Last, const _Ty& _Val) { // copy _Val through [_First, _Last) _Adl_verify_range(_First, _Last); auto _UFirst = _Get_unwrapped(_First); @@ -4165,7 +4165,7 @@ void fill(_ExPo&&, _FwdIt _First, _FwdIt _Last, const _Ty& _Val) noexcept /* ter // FUNCTION TEMPLATE fill_n #if _HAS_IF_CONSTEXPR template -_CONSTEXPR20_ICE _OutIt fill_n(_OutIt _Dest, const _Diff _Count_raw, const _Ty& _Val) { +_CONSTEXPR20 _OutIt fill_n(_OutIt _Dest, const _Diff _Count_raw, const _Ty& _Val) { // copy _Val _Count times through [_Dest, ...) _Algorithm_int_t<_Diff> _Count = _Count_raw; if (0 < _Count) { @@ -4287,7 +4287,7 @@ typename _Equal_memcmp_is_safe_helper, remove_const_t<_Obj #if _HAS_IF_CONSTEXPR template -_NODISCARD _CONSTEXPR20_ICE bool equal(const _InIt1 _First1, const _InIt1 _Last1, const _InIt2 _First2, _Pr _Pred) { +_NODISCARD _CONSTEXPR20 bool equal(const _InIt1 _First1, const _InIt1 _Last1, const _InIt2 _First2, _Pr _Pred) { // compare [_First1, _Last1) to [_First2, ...) using _Pred _Adl_verify_range(_First1, _Last1); auto _UFirst1 = _Get_unwrapped(_First1); @@ -4354,7 +4354,7 @@ _NODISCARD bool equal(const _InIt1 _First1, const _InIt1 _Last1, const _InIt2 _F #if _ITERATOR_DEBUG_ARRAY_OVERLOADS template , int> = 0> -_NODISCARD _CONSTEXPR20_ICE bool equal( +_NODISCARD _CONSTEXPR20 bool equal( const _InIt1 _First1, const _InIt1 _Last1, _RightTy (&_First2)[_RightSize], _Pr _Pred) { // compare [_First1, _Last1) to [_First2, ...) using _Pred return _STD equal(_First1, _Last1, _Array_iterator<_RightTy, _RightSize>(_First2), _Pass_fn(_Pred)); @@ -4381,14 +4381,14 @@ _NODISCARD bool equal(_ExPo&& _Exec, _FwdIt1 _First1, _FwdIt1 _Last1, _RightTy ( #endif // _HAS_CXX17 template -_NODISCARD _CONSTEXPR20_ICE bool equal(const _InIt1 _First1, const _InIt1 _Last1, const _InIt2 _First2) { +_NODISCARD _CONSTEXPR20 bool equal(const _InIt1 _First1, const _InIt1 _Last1, const _InIt2 _First2) { // compare [_First1, _Last1) to [_First2, ...) return _STD equal(_First1, _Last1, _First2, equal_to<>()); } #if _ITERATOR_DEBUG_ARRAY_OVERLOADS template -_NODISCARD _CONSTEXPR20_ICE bool equal(const _InIt1 _First1, const _InIt1 _Last1, _RightTy (&_First2)[_RightSize]) { +_NODISCARD _CONSTEXPR20 bool equal(const _InIt1 _First1, const _InIt1 _Last1, _RightTy (&_First2)[_RightSize]) { // compare [_First1, _Last1) to [_First2, ...) return _STD equal(_First1, _Last1, _First2, equal_to<>()); } @@ -4414,7 +4414,7 @@ _NODISCARD bool equal(_ExPo&& _Exec, const _FwdIt1 _First1, const _FwdIt1 _Last1 #if _HAS_IF_CONSTEXPR template -_NODISCARD _CONSTEXPR20_ICE bool equal( +_NODISCARD _CONSTEXPR20 bool equal( const _InIt1 _First1, const _InIt1 _Last1, const _InIt2 _First2, const _InIt2 _Last2, _Pr _Pred) { // compare [_First1, _Last1) to [_First2, _Last2) using _Pred _Adl_verify_range(_First1, _Last1); @@ -4499,7 +4499,7 @@ _NODISCARD bool equal(_ExPo&& _Exec, const _FwdIt1 _First1, const _FwdIt1 _Last1 #endif // _HAS_CXX17 template -_NODISCARD _CONSTEXPR20_ICE bool equal( +_NODISCARD _CONSTEXPR20 bool equal( const _InIt1 _First1, const _InIt1 _Last1, const _InIt2 _First2, const _InIt2 _Last2) { // compare [_First1, _Last1) to [_First2, _Last2) return _STD equal(_First1, _Last1, _First2, _Last2, equal_to<>()); @@ -4585,7 +4585,7 @@ _NODISCARD constexpr bool _Lex_compare_unchecked( } template -_NODISCARD _CONSTEXPR20_ICE bool _Lex_compare_unchecked( +_NODISCARD _CONSTEXPR20 bool _Lex_compare_unchecked( _InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _InIt2 _Last2, _Pr _Pred, _Lex_compare_optimize<_Memcmp_pr>) { // order [_First1, _Last1) vs. [_First2, _Last2) memcmp optimization #ifdef __cpp_lib_is_constant_evaluated @@ -4601,7 +4601,7 @@ _NODISCARD _CONSTEXPR20_ICE bool _Lex_compare_unchecked( } template -_NODISCARD _CONSTEXPR20_ICE bool lexicographical_compare( +_NODISCARD _CONSTEXPR20 bool lexicographical_compare( _InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _InIt2 _Last2, _Pr _Pred) { // order [_First1, _Last1) vs. [_First2, _Last2) using _Pred _Adl_verify_range(_First1, _Last1); @@ -4615,7 +4615,7 @@ _NODISCARD _CONSTEXPR20_ICE bool lexicographical_compare( } template -_NODISCARD _CONSTEXPR20_ICE bool lexicographical_compare(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _InIt2 _Last2) { +_NODISCARD _CONSTEXPR20 bool lexicographical_compare(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _InIt2 _Last2) { // order [_First1, _Last1) vs. [_First2, _Last2) return _STD lexicographical_compare(_First1, _Last1, _First2, _Last2, less<>()); } @@ -4696,7 +4696,7 @@ _NODISCARD constexpr _InIt _Find_unchecked1(_InIt _First, const _InIt _Last, con } template -_NODISCARD _CONSTEXPR20_ICE _InIt _Find_unchecked1(_InIt _First, const _InIt _Last, const _Ty& _Val, true_type) { +_NODISCARD _CONSTEXPR20 _InIt _Find_unchecked1(_InIt _First, const _InIt _Last, const _Ty& _Val, true_type) { // find first byte matching integral _Val if (!_Within_limits(_First, _Val)) { return _Last; @@ -4713,7 +4713,7 @@ _NODISCARD _CONSTEXPR20_ICE _InIt _Find_unchecked1(_InIt _First, const _InIt _La } template -_NODISCARD _CONSTEXPR20_ICE _InIt _Find_unchecked(const _InIt _First, const _InIt _Last, const _Ty& _Val) { +_NODISCARD _CONSTEXPR20 _InIt _Find_unchecked(const _InIt _First, const _InIt _Last, const _Ty& _Val) { // find first matching _Val; choose optimization // activate optimization for pointers to (const) bytes and integral values using _Memchr_opt = bool_constant< @@ -4724,7 +4724,7 @@ _NODISCARD _CONSTEXPR20_ICE _InIt _Find_unchecked(const _InIt _First, const _InI } template -_NODISCARD _CONSTEXPR20_ICE _InIt find(_InIt _First, const _InIt _Last, const _Ty& _Val) { // find first matching _Val +_NODISCARD _CONSTEXPR20 _InIt find(_InIt _First, const _InIt _Last, const _Ty& _Val) { // find first matching _Val _Adl_verify_range(_First, _Last); _Seek_wrapped(_First, _Find_unchecked(_Get_unwrapped(_First), _Get_unwrapped(_Last), _Val)); return _First; @@ -4969,7 +4969,7 @@ _NODISCARD _CONSTEXPR20 bool is_permutation(_FwdIt1 _First1, _FwdIt1 _Last1, _Fw // FUNCTION TEMPLATE reverse #if _HAS_IF_CONSTEXPR template -_CONSTEXPR20_ICE void reverse(const _BidIt _First, const _BidIt _Last) { // reverse elements in [_First, _Last) +_CONSTEXPR20 void reverse(const _BidIt _First, const _BidIt _Last) { // reverse elements in [_First, _Last) _Adl_verify_range(_First, _Last); auto _UFirst = _Get_unwrapped(_First); auto _ULast = _Get_unwrapped(_Last); diff --git a/stl/inc/yvals_core.h b/stl/inc/yvals_core.h index 8013e0619..60be7ce8f 100644 --- a/stl/inc/yvals_core.h +++ b/stl/inc/yvals_core.h @@ -1019,47 +1019,32 @@ #endif // _HAS_STD_BOOLEAN #endif // defined(__cpp_concepts) && __cpp_concepts > 201507L +#define __cpp_lib_constexpr_algorithms 201806L #define __cpp_lib_constexpr_memory 201811L +#define __cpp_lib_constexpr_numeric 201911L #define __cpp_lib_endian 201907L #define __cpp_lib_erase_if 201811L #define __cpp_lib_generic_unordered_lookup 201811L #define __cpp_lib_int_pow2 201806L - -#if defined(__clang__) || defined(__EDG__) || (defined(_MSC_VER) && _MSC_VER >= 1925) -#define __cpp_lib_is_constant_evaluated 201811L -#endif // TRANSITION, VS 2019 16.5 Preview 2 - -#define __cpp_lib_is_nothrow_convertible 201806L -#define __cpp_lib_list_remove_return_type 201806L -#define __cpp_lib_math_constants 201907L -#define __cpp_lib_remove_cvref 201711L -#define __cpp_lib_shift 201806L -#define __cpp_lib_span 201902L -#define __cpp_lib_ssize 201902L -#define __cpp_lib_starts_ends_with 201711L -#define __cpp_lib_to_address 201711L -#define __cpp_lib_to_array 201907L -#define __cpp_lib_type_identity 201806L -#define __cpp_lib_unwrap_ref 201811L - -#ifdef __cpp_lib_is_constant_evaluated -#define __cpp_lib_constexpr_algorithms 201806L -#define __cpp_lib_constexpr_numeric 201911L -#endif // __cpp_lib_is_constant_evaluated - +#define __cpp_lib_is_constant_evaluated 201811L +#define __cpp_lib_is_nothrow_convertible 201806L +#define __cpp_lib_list_remove_return_type 201806L +#define __cpp_lib_math_constants 201907L +#define __cpp_lib_remove_cvref 201711L +#define __cpp_lib_shift 201806L +#define __cpp_lib_span 201902L +#define __cpp_lib_ssize 201902L +#define __cpp_lib_starts_ends_with 201711L +#define __cpp_lib_to_address 201711L +#define __cpp_lib_to_array 201907L +#define __cpp_lib_type_identity 201806L +#define __cpp_lib_unwrap_ref 201811L #endif // _HAS_CXX20 // EXPERIMENTAL #define __cpp_lib_experimental_erase_if 201411L #define __cpp_lib_experimental_filesystem 201406L -// Functions that became constexpr in C++20, and require is_constant_evaluated -#ifdef __cpp_lib_is_constant_evaluated -#define _CONSTEXPR20_ICE constexpr -#else // ^^^ constexpr with is_constant_evaluated / inline without is_constant_evaluated vvv -#define _CONSTEXPR20_ICE inline -#endif // __cpp_lib_is_constant_evaluated - #ifdef _RTC_CONVERSION_CHECKS_ENABLED #ifndef _ALLOW_RTCc_IN_STL #error /RTCc rejects conformant code, so it is not supported by the C++ Standard Library. Either remove this \