aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2020-01-29 13:56:49 +0000
committerJonathan Wakely <jwakely@redhat.com>2020-01-29 13:56:49 +0000
commitf214ffb336d582a66149068a2a96b7fcf395b5de (patch)
tree1cf499bba1c63de4edf244c2387cb30777eceaf8
parent83b0201035cfdc1d4d80153f4e19ec98cf059941 (diff)
downloadgcc-f214ffb336d582a66149068a2a96b7fcf395b5de.zip
gcc-f214ffb336d582a66149068a2a96b7fcf395b5de.tar.gz
gcc-f214ffb336d582a66149068a2a96b7fcf395b5de.tar.bz2
libstdc++: Simplify constraints on std::compare_three_way
The __3way_builtin_ptr_cmp concept can use three_way_comparable_with to check whether <=> is valid. Doing that makes it obvious that the disjunction on compare_three_way::operator() is redundant, because the second constraint subsumes the first. The workaround for PR c++/91073 can also be removed as that bug is fixed now. * libsupc++/compare (__detail::__3way_builtin_ptr_cmp): Use three_way_comparable_with. (__detail::__3way_cmp_with): Remove workaround for fixed bug. (compare_three_way::operator()): Remove redundant constraint from requires-clause. (__detail::_Synth3way::operator()): Use three_way_comparable_with instead of workaround. * testsuite/18_support/comparisons/object/93479.cc: Prune extra output due to simplified constraints on compare_three_way::operator().
-rw-r--r--libstdc++-v3/ChangeLog10
-rw-r--r--libstdc++-v3/libsupc++/compare12
-rw-r--r--libstdc++-v3/testsuite/18_support/comparisons/object/93479.cc2
3 files changed, 15 insertions, 9 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 2c3d33e..e9a8a67 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,5 +1,15 @@
2020-01-29 Jonathan Wakely <jwakely@redhat.com>
+ * libsupc++/compare (__detail::__3way_builtin_ptr_cmp): Use
+ three_way_comparable_with.
+ (__detail::__3way_cmp_with): Remove workaround for fixed bug.
+ (compare_three_way::operator()): Remove redundant constraint from
+ requires-clause.
+ (__detail::_Synth3way::operator()): Use three_way_comparable_with
+ instead of workaround.
+ * testsuite/18_support/comparisons/object/93479.cc: Prune extra
+ output due to simplified constraints on compare_three_way::operator().
+
PR libstdc++/93479
* libsupc++/compare (__3way_builtin_ptr_cmp): Require <=> to be valid.
* testsuite/18_support/comparisons/object/93479.cc: New test.
diff --git a/libstdc++-v3/libsupc++/compare b/libstdc++-v3/libsupc++/compare
index aabd0c5..a7a29ef 100644
--- a/libstdc++-v3/libsupc++/compare
+++ b/libstdc++-v3/libsupc++/compare
@@ -525,26 +525,20 @@ namespace std
// BUILTIN-PTR-THREE-WAY(T, U)
template<typename _Tp, typename _Up>
concept __3way_builtin_ptr_cmp
- = requires(_Tp&& __t, _Up&& __u)
- { static_cast<_Tp&&>(__t) <=> static_cast<_Up&&>(__u); }
+ = three_way_comparable_with<_Tp, _Up>
&& convertible_to<_Tp, const volatile void*>
&& convertible_to<_Up, const volatile void*>
&& ! requires(_Tp&& __t, _Up&& __u)
{ operator<=>(static_cast<_Tp&&>(__t), static_cast<_Up&&>(__u)); }
&& ! requires(_Tp&& __t, _Up&& __u)
{ static_cast<_Tp&&>(__t).operator<=>(static_cast<_Up&&>(__u)); };
-
- // FIXME: workaround for PR c++/91073
- template<typename _Tp, typename _Up>
- concept __3way_cmp_with = three_way_comparable_with<_Tp, _Up>;
} // namespace __detail
// [cmp.object], typename compare_three_way
struct compare_three_way
{
template<typename _Tp, typename _Up>
- requires (__detail::__3way_cmp_with<_Tp, _Up>
- || __detail::__3way_builtin_ptr_cmp<_Tp, _Up>)
+ requires three_way_comparable_with<_Tp, _Up>
constexpr auto
operator()(_Tp&& __t, _Up&& __u) const noexcept
{
@@ -919,7 +913,7 @@ namespace std
{ __u < __t } -> convertible_to<bool>;
}
{
- if constexpr (__3way_cmp_with<_Tp, _Up>)
+ if constexpr (three_way_comparable_with<_Tp, _Up>)
return __t <=> __u;
else
{
diff --git a/libstdc++-v3/testsuite/18_support/comparisons/object/93479.cc b/libstdc++-v3/testsuite/18_support/comparisons/object/93479.cc
index 7da1df1..f4f0a36 100644
--- a/libstdc++-v3/testsuite/18_support/comparisons/object/93479.cc
+++ b/libstdc++-v3/testsuite/18_support/comparisons/object/93479.cc
@@ -42,3 +42,5 @@ test02()
std::compare_three_way{}(x, ""); // { dg-error "no match" }
std::compare_three_way{}("", x); // { dg-error "no match" }
}
+
+// { dg-prune-output "in requirements with" }