Commit f31a99f7 by Jonathan Wakely Committed by Jonathan Wakely

libstdc++: Define __cpp_lib_three_way_comparison conditionally

The contents of the <compare> header are not complete unless concepts
are supported, so the feature test macro should depend on the macro for
concepts.

As a result, the std::lexicographical_compare_three_way function will
not be defined unless concepts are supported, so there is no need to
check __cpp_lib_concepts before using concepts in those functions.

	* include/bits/stl_algobase.h (__is_byte_iter, __min_cmp)
	(lexicographical_compare_three_way): Do not depend on
	__cpp_lib_concepts.
	* include/std/version (__cpp_lib_three_way_comparison): Only define
	when __cpp_lib_concepts is defined.
	* libsupc++/compare (__cpp_lib_three_way_comparison): Likewise.

From-SVN: r279896
parent 4ce43ba4
2020-01-06 Jonathan Wakely <jwakely@redhat.com>
* include/bits/stl_algobase.h (__is_byte_iter, __min_cmp)
(lexicographical_compare_three_way): Do not depend on
__cpp_lib_concepts.
* include/std/version (__cpp_lib_three_way_comparison): Only define
when __cpp_lib_concepts is defined.
* libsupc++/compare (__cpp_lib_three_way_comparison): Likewise.
2020-01-03 Jonathan Wakely <jwakely@redhat.com> 2020-01-03 Jonathan Wakely <jwakely@redhat.com>
* include/bits/stl_algobase.h (lexicographical_compare_three_way): * include/bits/stl_algobase.h (lexicographical_compare_three_way):
......
...@@ -1667,7 +1667,6 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO ...@@ -1667,7 +1667,6 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
} }
#if __cpp_lib_three_way_comparison #if __cpp_lib_three_way_comparison
#if __cpp_lib_concepts
// Iter points to a contiguous range of unsigned narrow character type // Iter points to a contiguous range of unsigned narrow character type
// or std::byte, suitable for comparison by memcmp. // or std::byte, suitable for comparison by memcmp.
template<typename _Iter> template<typename _Iter>
...@@ -1690,7 +1689,6 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO ...@@ -1690,7 +1689,6 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
return _Res{__y, __c}; return _Res{__y, __c};
return _Res{__x, __c}; return _Res{__x, __c};
} }
#endif
/** /**
* @brief Performs dictionary comparison on ranges. * @brief Performs dictionary comparison on ranges.
...@@ -1718,7 +1716,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO ...@@ -1718,7 +1716,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
__glibcxx_requires_valid_range(__first1, __last1); __glibcxx_requires_valid_range(__first1, __last1);
__glibcxx_requires_valid_range(__first2, __last2); __glibcxx_requires_valid_range(__first2, __last2);
#if __cpp_lib_concepts && __cpp_lib_is_constant_evaluated #if __cpp_lib_is_constant_evaluated
using _Cat = decltype(__comp(*__first1, *__first2)); using _Cat = decltype(__comp(*__first1, *__first2));
static_assert(same_as<common_comparison_category_t<_Cat>, _Cat>); static_assert(same_as<common_comparison_category_t<_Cat>, _Cat>);
...@@ -1739,7 +1737,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO ...@@ -1739,7 +1737,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
} }
return __lencmp; return __lencmp;
} }
#endif // concepts && is_constant_evaluated #endif // is_constant_evaluated
while (__first1 != __last1 && __first2 != __last2) while (__first1 != __last1 && __first2 != __last2)
{ {
if (auto __cmp = __comp(*__first1, *__first2); __cmp != 0) if (auto __cmp = __comp(*__first1, *__first2); __cmp != 0)
...@@ -1751,7 +1749,6 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO ...@@ -1751,7 +1749,6 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
: __first2 != __last2 ? strong_ordering::less : strong_ordering::equal; : __first2 != __last2 ? strong_ordering::less : strong_ordering::equal;
} }
#if __cpp_lib_concepts
template<typename _InputIter1, typename _InputIter2> template<typename _InputIter1, typename _InputIter2>
constexpr auto constexpr auto
lexicographical_compare_three_way(_InputIter1 __first1, lexicographical_compare_three_way(_InputIter1 __first1,
...@@ -1763,7 +1760,6 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO ...@@ -1763,7 +1760,6 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
__first2, __last2, __first2, __last2,
compare_three_way{}); compare_three_way{});
} }
#endif // concepts
#endif // three_way_comparison #endif // three_way_comparison
template<typename _InputIterator1, typename _InputIterator2, template<typename _InputIterator1, typename _InputIterator2,
......
...@@ -191,7 +191,7 @@ ...@@ -191,7 +191,7 @@
#define __cpp_lib_list_remove_return_type 201806L #define __cpp_lib_list_remove_return_type 201806L
#define __cpp_lib_math_constants 201907L #define __cpp_lib_math_constants 201907L
#define __cpp_lib_span 201902L #define __cpp_lib_span 201902L
#if __cpp_impl_three_way_comparison >= 201907L #if __cpp_impl_three_way_comparison >= 201907L && __cpp_lib_concepts
# define __cpp_lib_three_way_comparison 201711L # define __cpp_lib_three_way_comparison 201711L
#endif #endif
#define __cpp_lib_to_array 201907L #define __cpp_lib_to_array 201907L
......
...@@ -38,10 +38,12 @@ ...@@ -38,10 +38,12 @@
#include <concepts> #include <concepts>
#if __cpp_lib_concepts
# define __cpp_lib_three_way_comparison 201711L
#endif
namespace std namespace std
{ {
#define __cpp_lib_three_way_comparison 201711L
// [cmp.categories], comparison category types // [cmp.categories], comparison category types
namespace __cmp_cat namespace __cmp_cat
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment