]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Implement LWG 3465 for std::compare_partial_order_fallback [PR101056]
authorJonathan Wakely <jwakely@redhat.com>
Mon, 14 Jun 2021 11:30:52 +0000 (12:30 +0100)
committerJonathan Wakely <jwakely@redhat.com>
Mon, 14 Jun 2021 13:04:45 +0000 (14:04 +0100)
libstdc++-v3/ChangeLog:

PR libstdc++/101056
* libsupc++/compare (compare_partial_order_fallback): Add
constraint using reversed parameter order, as per LWG 3465.
* testsuite/18_support/comparisons/algorithms/fallback.cc:
Adjust expected result.

libstdc++-v3/libsupc++/compare
libstdc++-v3/testsuite/18_support/comparisons/algorithms/fallback.cc

index b1f342113f1ef46d8a062d8f620ef80d3c9094d1..dd0ec5fa36db501ad9ac64fbdffeb2cd83f34816 100644 (file)
@@ -806,6 +806,16 @@ namespace std
        }
     };
 
+    // _GLIBCXX_RESOLVE_LIB_DEFECTS
+    // 3465. compare_partial_order_fallback requires F < E
+    template<typename _Tp, typename _Up>
+      concept __op_eq_lt_lt = __op_eq_lt<_Tp, _Up>
+       && requires(_Tp&& __t, _Up&& __u)
+       {
+         { static_cast<_Up&&>(__u) < static_cast<_Tp&&>(__t) }
+           -> convertible_to<bool>;
+       };
+
     class _Partial_fallback
     {
       template<typename _Tp, typename _Up>
@@ -821,7 +831,7 @@ namespace std
 
     public:
       template<typename _Tp, __decayed_same_as<_Tp> _Up>
-       requires __partially_ordered<_Tp, _Up> || __op_eq_lt<_Tp, _Up>
+       requires __partially_ordered<_Tp, _Up> || __op_eq_lt_lt<_Tp, _Up>
        constexpr partial_ordering
        operator()(_Tp&& __e, _Up&& __f) const
        noexcept(_S_noexcept<_Tp, _Up>())
@@ -829,7 +839,7 @@ namespace std
          if constexpr (__partially_ordered<_Tp, _Up>)
            return _Partial_order{}(static_cast<_Tp&&>(__e),
                                    static_cast<_Up&&>(__f));
-         else // __op_eq_lt<_Tp, _Up>
+         else // __op_eq_lt_lt<_Tp, _Up>
            return static_cast<_Tp&&>(__e) == static_cast<_Up&&>(__f)
              ? partial_ordering::equivalent
              : static_cast<_Tp&&>(__e) < static_cast<_Up&&>(__f)
index ae458528f179d319a7abfdf567d0c11114355036..05e1bf7775e6634838a370b99705cc96fbe6870a 100644 (file)
@@ -38,5 +38,5 @@ static_assert( has_weak_order_fallback<S, S> );
 static_assert( has_weak_order_fallback<const S, S> );
 static_assert( ! has_weak_order_fallback<const S, const S> );
 static_assert( has_partial_order_fallback<S, S> );
-static_assert( has_partial_order_fallback<const S, S> );
+static_assert( ! has_partial_order_fallback<const S, S> ); // LWG 3465
 static_assert( ! has_partial_order_fallback<const S, const S> );