libstdc++: Simplify constraints on std::compare_three_way
authorJonathan Wakely <jwakely@redhat.com>
Wed, 29 Jan 2020 13:56:49 +0000 (13:56 +0000)
committerJonathan Wakely <jwakely@redhat.com>
Wed, 29 Jan 2020 13:56:49 +0000 (13:56 +0000)
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().

libstdc++-v3/ChangeLog
libstdc++-v3/libsupc++/compare
libstdc++-v3/testsuite/18_support/comparisons/object/93479.cc

index 2c3d33e96ca1c0195f78f0ad0bda8510dcea8956..e9a8a677e4cf4b7a2a97b744948e32dc54ecf1e3 100644 (file)
@@ -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.
index aabd0c56530a7f8b44f19f99e4c21552b7f40697..a7a29ef0440fa7226e8f899824a60ba3db7222fe 100644 (file)
@@ -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
            {
index 7da1df1584832e9348017a140be986f865200c2e..f4f0a36685b5253a92b42598139ae52652b47f49 100644 (file)
@@ -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" }