libstdc++: Update __cpp_lib_three_way_comparison macro
authorJonathan Wakely <jwakely@redhat.com>
Mon, 20 Apr 2020 16:50:10 +0000 (17:50 +0100)
committerJonathan Wakely <jwakely@redhat.com>
Mon, 20 Apr 2020 16:50:10 +0000 (17:50 +0100)
With P1614R2 fully implemented (except for the <chrono> types which we
don't support at all) we can define the feature test macro to the new
value.

* include/std/version (__cpp_lib_three_way_comparison): Update value.
* libsupc++/compare (__cpp_lib_three_way_comparison): Likewise.

libstdc++-v3/ChangeLog
libstdc++-v3/include/std/version
libstdc++-v3/libsupc++/compare

index 3d0ddf5..7e6a010 100644 (file)
@@ -1,5 +1,8 @@
 2020-04-20  Jonathan Wakely  <jwakely@redhat.com>
 
+       * include/std/version (__cpp_lib_three_way_comparison): Update value.
+       * libsupc++/compare (__cpp_lib_three_way_comparison): Likewise.
+
        * include/bits/stl_map.h (map): Define operator<=> and remove
        operator< for C++20.
        * include/bits/stl_multimap.h (multimap): Likewise.
index d9a47ee..6d7dcc4 100644 (file)
 #endif
 #define __cpp_lib_span 202002L
 #if __cpp_impl_three_way_comparison >= 201907L && __cpp_lib_concepts
-# define __cpp_lib_three_way_comparison 201711L
+# define __cpp_lib_three_way_comparison 201907L
 #endif
 #define __cpp_lib_to_array 201907L
 #endif
index e5fb322..28dfe84 100644 (file)
@@ -39,7 +39,7 @@
 #include <concepts>
 
 #if __cpp_lib_concepts
-# define __cpp_lib_three_way_comparison 201711L
+# define __cpp_lib_three_way_comparison 201907L
 #endif
 
 namespace std
@@ -866,12 +866,23 @@ namespace std
 
   namespace __detail
   {
-    // [expos.only.func]
+    // [expos.only.func] synth-three-way
     inline constexpr struct _Synth3way
     {
       template<typename _Tp, typename _Up>
+       static constexpr bool
+       _S_noexcept(const _Tp* __t = nullptr, const _Up* __u = nullptr)
+       {
+         if constexpr (three_way_comparable_with<_Tp, _Up>)
+           return noexcept(*__t <=> *__u);
+         else
+           return noexcept(*__t < *__u) && noexcept(*__u < *__t);
+       }
+
+      template<typename _Tp, typename _Up>
        constexpr auto
        operator()(const _Tp& __t, const _Up& __u) const
+       noexcept(_S_noexcept<_Tp, _Up>())
        requires requires
        {
          { __t < __u } -> __boolean_testable;
@@ -892,6 +903,7 @@ namespace std
        }
     } __synth3way = {};
 
+    // [expos.only.func] synth-three-way-result
     template<typename _Tp, typename _Up = _Tp>
       using __synth3way_t
        = decltype(__detail::__synth3way(std::declval<_Tp&>(),