2019-11-06 Jonathan Wakely <jwakely@redhat.com>
+ * include/Makefile.in: Regenerate.
+ * libsupc++/Makefile.in: Regenerate.
+ * libsupc++/compare (__3way_builtin_ptr_cmp): Define helper.
+ (compare_three_way): Add missing implementation.
+
* include/bits/iterator_concepts.h (unreachable_sentinel_t): Remove
redundant equality operators.
* testsuite/util/testsuite_iterators.h (test_range::sentinel):
# <new>, <typeinfo>, <exception>, <initializer_list>, <cstdalign>, <cstdarg>,
# <concepts>, <cstdbool>, <type_traits>, <bit>, <atomic>,
# and any files which they include (and which we provide).
-# <new>, <typeinfo>, <exception>, and <initializer_list> are installed by
-# libsupc++, so only the others and the sub-includes are copied here.
+# <new>, <typeinfo>, <exception>, <initializer_list> and <compare>
+# are installed by libsupc++, so only the others and the sub-includes
+# are copied here.
install-freestanding-headers:
$(mkinstalldirs) $(DESTDIR)${gxx_include_dir}/bits
for file in c++0x_warning.h atomic_base.h concept_check.h move.h; do \
// [cmp.common], common comparison category type
template<typename... _Ts>
- struct common_comparison_category {
+ struct common_comparison_category
+ {
// using type = TODO
};
using common_comparison_category_t
= typename common_comparison_category<_Ts...>::type;
-#if __cpp_concepts
+#if __cpp_lib_concepts
namespace __detail
{
template<typename _Tp, typename _Cat>
using compare_three_way_result_t
= typename compare_three_way_result<_Tp, _Up>::__type;
+#if __cpp_lib_concepts
+ namespace __detail
+ {
+ // BUILTIN-PTR-THREE-WAY(T, U)
+ template<typename _Tp, typename _Up>
+ concept __3way_builtin_ptr_cmp
+ = 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)); };
+ } // namespace __detail
+
// [cmp.object], typename compare_three_way
struct compare_three_way
{
- // TODO
-#if 0
template<typename _Tp, typename _Up>
requires (three_way_comparable_with<_Tp, _Up>
- || BUILTIN-PTR-THREE-WAY(_Tp, _Up))
+ || __detail::__3way_builtin_ptr_cmp<_Tp, _Up>)
constexpr auto
operator()(_Tp&& __t, _Up&& __u) const noexcept
{
- // TODO
+ if constexpr (__detail::__3way_builtin_ptr_cmp<_Tp, _Up>)
+ {
+ auto __pt = static_cast<const volatile void*>(__t);
+ auto __pu = static_cast<const volatile void*>(__u);
+ if (__builtin_is_constant_evaluated())
+ return __pt <=> __pu;
+ auto __it = reinterpret_cast<__UINTPTR_TYPE__>(__pt);
+ auto __iu = reinterpret_cast<__UINTPTR_TYPE__>(__pu);
+ return __it <=> __iu;
+ }
+ else
+ return static_cast<_Tp&&>(__t) <=> static_cast<_Up&&>(__u);
}
-#endif
using is_transparent = void;
};
inline constexpr unspecified compare_partial_order_fallback = unspecified;
#endif
}
-}
+#endif
+} // namespace std
#pragma GCC visibility pop