aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2019-11-06 17:53:38 +0000
committerJonathan Wakely <redi@gcc.gnu.org>2019-11-06 17:53:38 +0000
commit0c92c8627c1cbf7cbc76d065514a564dc8f044c0 (patch)
tree9d839f6dc9f42382290e742a242648ea986e2400
parentd37303d15af7ff6f89989a70605a8225be0ffa6d (diff)
downloadgcc-0c92c8627c1cbf7cbc76d065514a564dc8f044c0.zip
gcc-0c92c8627c1cbf7cbc76d065514a564dc8f044c0.tar.gz
gcc-0c92c8627c1cbf7cbc76d065514a564dc8f044c0.tar.bz2
libstdc++: Add compare_three_way and install <compare> header
* include/Makefile.in: Regenerate. * libsupc++/Makefile.in: Regenerate. * libsupc++/compare (__3way_builtin_ptr_cmp): Define helper. (compare_three_way): Add missing implementation. From-SVN: r277889
-rw-r--r--libstdc++-v3/ChangeLog5
-rw-r--r--libstdc++-v3/include/Makefile.in5
-rw-r--r--libstdc++-v3/libsupc++/Makefile.in2
-rw-r--r--libstdc++-v3/libsupc++/compare40
4 files changed, 41 insertions, 11 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 5dece5c..3eb2018 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,5 +1,10 @@
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):
diff --git a/libstdc++-v3/include/Makefile.in b/libstdc++-v3/include/Makefile.in
index d9eb306..acc4fe5 100644
--- a/libstdc++-v3/include/Makefile.in
+++ b/libstdc++-v3/include/Makefile.in
@@ -1859,8 +1859,9 @@ ${pch3_output}: ${pch3_source} ${pch2_output}
# <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 \
diff --git a/libstdc++-v3/libsupc++/Makefile.in b/libstdc++-v3/libsupc++/Makefile.in
index 5d8ac5c..38e34cb 100644
--- a/libstdc++-v3/libsupc++/Makefile.in
+++ b/libstdc++-v3/libsupc++/Makefile.in
@@ -483,7 +483,7 @@ toolexeclib_LTLIBRARIES = libsupc++.la
# 2) integrated libsupc++convenience.la that is to be a part of libstdc++.a
noinst_LTLIBRARIES = libsupc++convenience.la
std_HEADERS = \
- cxxabi.h exception initializer_list new typeinfo
+ compare cxxabi.h exception initializer_list new typeinfo
bits_HEADERS = \
atomic_lockfree_defines.h cxxabi_forced.h \
diff --git a/libstdc++-v3/libsupc++/compare b/libstdc++-v3/libsupc++/compare
index 379b2d4..2e518cc 100644
--- a/libstdc++-v3/libsupc++/compare
+++ b/libstdc++-v3/libsupc++/compare
@@ -519,7 +519,8 @@ namespace std
// [cmp.common], common comparison category type
template<typename... _Ts>
- struct common_comparison_category {
+ struct common_comparison_category
+ {
// using type = TODO
};
@@ -527,7 +528,7 @@ namespace std
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>
@@ -604,20 +605,42 @@ namespace std
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;
};
@@ -635,7 +658,8 @@ namespace std
inline constexpr unspecified compare_partial_order_fallback = unspecified;
#endif
}
-}
+#endif
+} // namespace std
#pragma GCC visibility pop