aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/include
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2024-03-22 13:20:21 +0000
committerJonathan Wakely <jwakely@redhat.com>2024-04-15 19:26:09 +0100
commit0d58450659ade002666c1c3604c94cd8e0cc6b50 (patch)
tree236faeaef55fcd995970dee5f0048d2b443490fb /libstdc++-v3/include
parent2a0c083558b4ac6609692294df7a388cf4468711 (diff)
downloadgcc-0d58450659ade002666c1c3604c94cd8e0cc6b50.zip
gcc-0d58450659ade002666c1c3604c94cd8e0cc6b50.tar.gz
gcc-0d58450659ade002666c1c3604c94cd8e0cc6b50.tar.bz2
libstdc++: Add std::reference_wrapper comparison operators for C++26
This C++26 change was just approved in Tokyo, in P2944R3. It adds operator== and operator<=> overloads to std::reference_wrapper. The operator<=> overloads in the paper cause compilation errors for any type without <=> so they're implemented here with deduced return types and constrained by a requires clause. libstdc++-v3/ChangeLog: * include/bits/refwrap.h (reference_wrapper): Add comparison operators as proposed by P2944R3. * include/bits/version.def (reference_wrapper): Define. * include/bits/version.h: Regenerate. * include/std/functional: Enable feature test macro. * testsuite/20_util/reference_wrapper/compare.cc: New test.
Diffstat (limited to 'libstdc++-v3/include')
-rw-r--r--libstdc++-v3/include/bits/refwrap.h45
-rw-r--r--libstdc++-v3/include/bits/version.def8
-rw-r--r--libstdc++-v3/include/bits/version.h10
-rw-r--r--libstdc++-v3/include/std/functional1
4 files changed, 64 insertions, 0 deletions
diff --git a/libstdc++-v3/include/bits/refwrap.h b/libstdc++-v3/include/bits/refwrap.h
index 2d4338b..fd1cc2b 100644
--- a/libstdc++-v3/include/bits/refwrap.h
+++ b/libstdc++-v3/include/bits/refwrap.h
@@ -38,6 +38,10 @@
#include <bits/invoke.h>
#include <bits/stl_function.h> // for unary_function and binary_function
+#if __glibcxx_reference_wrapper >= 202403L // >= C++26
+# include <compare>
+#endif
+
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
@@ -358,6 +362,47 @@ _GLIBCXX_MEM_FN_TRAITS(&& noexcept, false_type, true_type)
#endif
return std::__invoke(get(), std::forward<_Args>(__args)...);
}
+
+#if __glibcxx_reference_wrapper >= 202403L // >= C++26
+ // [refwrap.comparisons], comparisons
+ [[nodiscard]]
+ friend constexpr bool
+ operator==(reference_wrapper __x, reference_wrapper __y)
+ requires requires { { __x.get() == __y.get() } -> convertible_to<bool>; }
+ { return __x.get() == __y.get(); }
+
+ [[nodiscard]]
+ friend constexpr bool
+ operator==(reference_wrapper __x, const _Tp& __y)
+ requires requires { { __x.get() == __y } -> convertible_to<bool>; }
+ { return __x.get() == __y; }
+
+ [[nodiscard]]
+ friend constexpr bool
+ operator==(reference_wrapper __x, reference_wrapper<const _Tp> __y)
+ requires (!is_const_v<_Tp>)
+ && requires { { __x.get() == __y.get() } -> convertible_to<bool>; }
+ { return __x.get() == __y.get(); }
+
+ [[nodiscard]]
+ friend constexpr auto
+ operator<=>(reference_wrapper __x, reference_wrapper<_Tp> __y)
+ requires requires { __detail::__synth3way(__x.get(), __y.get()); }
+ { return __detail::__synth3way(__x.get(), __y.get()); }
+
+ [[nodiscard]]
+ friend constexpr auto
+ operator<=>(reference_wrapper __x, const _Tp& __y)
+ requires requires { __detail::__synth3way(__x.get(), __y); }
+ { return __detail::__synth3way(__x.get(), __y); }
+
+ [[nodiscard]]
+ friend constexpr auto
+ operator<=>(reference_wrapper __x, reference_wrapper<const _Tp> __y)
+ requires (!is_const_v<_Tp>)
+ && requires { __detail::__synth3way(__x.get(), __y.get()); }
+ { return __detail::__synth3way(__x.get(), __y.get()); }
+#endif
};
#if __cpp_deduction_guides
diff --git a/libstdc++-v3/include/bits/version.def b/libstdc++-v3/include/bits/version.def
index 5ad4494..5c0477f 100644
--- a/libstdc++-v3/include/bits/version.def
+++ b/libstdc++-v3/include/bits/version.def
@@ -1761,6 +1761,14 @@ ftms = {
};
ftms = {
+ name = reference_wrapper;
+ values = {
+ v = 202403;
+ cxxmin = 26;
+ };
+};
+
+ftms = {
name = saturation_arithmetic;
values = {
v = 202311;
diff --git a/libstdc++-v3/include/bits/version.h b/libstdc++-v3/include/bits/version.h
index 460a3e0..65e708c 100644
--- a/libstdc++-v3/include/bits/version.h
+++ b/libstdc++-v3/include/bits/version.h
@@ -1963,6 +1963,16 @@
#endif /* !defined(__cpp_lib_ratio) && defined(__glibcxx_want_ratio) */
#undef __glibcxx_want_ratio
+#if !defined(__cpp_lib_reference_wrapper)
+# if (__cplusplus > 202302L)
+# define __glibcxx_reference_wrapper 202403L
+# if defined(__glibcxx_want_all) || defined(__glibcxx_want_reference_wrapper)
+# define __cpp_lib_reference_wrapper 202403L
+# endif
+# endif
+#endif /* !defined(__cpp_lib_reference_wrapper) && defined(__glibcxx_want_reference_wrapper) */
+#undef __glibcxx_want_reference_wrapper
+
#if !defined(__cpp_lib_saturation_arithmetic)
# if (__cplusplus > 202302L)
# define __glibcxx_saturation_arithmetic 202311L
diff --git a/libstdc++-v3/include/std/functional b/libstdc++-v3/include/std/functional
index 766558b..9936428 100644
--- a/libstdc++-v3/include/std/functional
+++ b/libstdc++-v3/include/std/functional
@@ -83,6 +83,7 @@
#define __glibcxx_want_move_only_function
#define __glibcxx_want_not_fn
#define __glibcxx_want_ranges
+#define __glibcxx_want_reference_wrapper
#define __glibcxx_want_transparent_operators
#include <bits/version.h>