From 00f6e657d8ee304ddb02c6f3fba15bb807bbcab7 Mon Sep 17 00:00:00 2001 From: Mark de Wever Date: Thu, 9 May 2024 20:32:09 +0200 Subject: [PATCH] [libc++] Deprecates rel_ops. These operators were deprecated in P0768R1 Library Support for the Spaceship (Comparison) Operator This was discovered while investigating the paper's implementation status. --- libcxx/docs/ReleaseNotes/19.rst | 2 ++ libcxx/include/__utility/rel_ops.h | 8 ++--- .../rel_ops.depr_in_cxx20.verify.cpp | 35 +++++++++++++++++++ .../iterator.rel_ops.compile.pass.cpp | 2 ++ .../utility/operators/rel_ops.pass.cpp | 2 ++ 5 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 libcxx/test/libcxx/depr/depr.rel_ops/rel_ops.depr_in_cxx20.verify.cpp diff --git a/libcxx/docs/ReleaseNotes/19.rst b/libcxx/docs/ReleaseNotes/19.rst index e6d8acb74aeb20..05aeaba7f8716f 100644 --- a/libcxx/docs/ReleaseNotes/19.rst +++ b/libcxx/docs/ReleaseNotes/19.rst @@ -141,6 +141,8 @@ Deprecations and Removals of randomness, and others. Users that were checking whether including a header would fail (e.g. via a script or CMake's ``try_compile`` will experience a change in behavior). +- The operators in the ``rel_ops`` namespace have been deprecated. The deprecation is part of the paper + P0768R1 "Library Support for the Spaceship (Comparison) Operator". Upcoming Deprecations and Removals ---------------------------------- diff --git a/libcxx/include/__utility/rel_ops.h b/libcxx/include/__utility/rel_ops.h index ee8657196d98c0..a8caf5bdeaf278 100644 --- a/libcxx/include/__utility/rel_ops.h +++ b/libcxx/include/__utility/rel_ops.h @@ -20,22 +20,22 @@ _LIBCPP_BEGIN_NAMESPACE_STD namespace rel_ops { template -inline _LIBCPP_HIDE_FROM_ABI bool operator!=(const _Tp& __x, const _Tp& __y) { +inline _LIBCPP_DEPRECATED_IN_CXX20 _LIBCPP_HIDE_FROM_ABI bool operator!=(const _Tp& __x, const _Tp& __y) { return !(__x == __y); } template -inline _LIBCPP_HIDE_FROM_ABI bool operator>(const _Tp& __x, const _Tp& __y) { +inline _LIBCPP_DEPRECATED_IN_CXX20 _LIBCPP_HIDE_FROM_ABI bool operator>(const _Tp& __x, const _Tp& __y) { return __y < __x; } template -inline _LIBCPP_HIDE_FROM_ABI bool operator<=(const _Tp& __x, const _Tp& __y) { +inline _LIBCPP_DEPRECATED_IN_CXX20 _LIBCPP_HIDE_FROM_ABI bool operator<=(const _Tp& __x, const _Tp& __y) { return !(__y < __x); } template -inline _LIBCPP_HIDE_FROM_ABI bool operator>=(const _Tp& __x, const _Tp& __y) { +inline _LIBCPP_DEPRECATED_IN_CXX20 _LIBCPP_HIDE_FROM_ABI bool operator>=(const _Tp& __x, const _Tp& __y) { return !(__x < __y); } diff --git a/libcxx/test/libcxx/depr/depr.rel_ops/rel_ops.depr_in_cxx20.verify.cpp b/libcxx/test/libcxx/depr/depr.rel_ops/rel_ops.depr_in_cxx20.verify.cpp new file mode 100644 index 00000000000000..35457f65fe2eb9 --- /dev/null +++ b/libcxx/test/libcxx/depr/depr.rel_ops/rel_ops.depr_in_cxx20.verify.cpp @@ -0,0 +1,35 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// + +// UNSUPPORTED: c++03, c++11, c++14, c++17 + +#include +#include + +struct A { + int data_ = 0; +}; + +inline bool operator==(const A& x, const A& y) { return x.data_ == y.data_; } + +inline bool operator<(const A& x, const A& y) { return x.data_ < y.data_; } + +void test() { + using namespace std::rel_ops; + A a1{1}; + A a2{2}; + (void)(a1 == a1); + (void)(a1 != a2); // note not deprecated message, due to compiler generated operator. + std::rel_ops::operator!=(a1, a2); // expected-warning {{is deprecated}} + (void)(a1 < a2); + (void)(a1 > a2); // expected-warning 2 {{is deprecated}} + (void)(a1 <= a2); // expected-warning 2 {{is deprecated}} + (void)(a1 >= a2); // expected-warning 2 {{is deprecated}} +} diff --git a/libcxx/test/std/containers/iterator.rel_ops.compile.pass.cpp b/libcxx/test/std/containers/iterator.rel_ops.compile.pass.cpp index aaaa887f72074a..9db2449f2f1665 100644 --- a/libcxx/test/std/containers/iterator.rel_ops.compile.pass.cpp +++ b/libcxx/test/std/containers/iterator.rel_ops.compile.pass.cpp @@ -8,6 +8,8 @@ // XFAIL: availability-filesystem-missing +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + // Make sure the various containers' iterators are not broken by the use of `std::rel_ops`. #include // for std::rel_ops diff --git a/libcxx/test/std/utilities/utility/operators/rel_ops.pass.cpp b/libcxx/test/std/utilities/utility/operators/rel_ops.pass.cpp index 52ed6422741149..db0c7a61bddd63 100644 --- a/libcxx/test/std/utilities/utility/operators/rel_ops.pass.cpp +++ b/libcxx/test/std/utilities/utility/operators/rel_ops.pass.cpp @@ -8,6 +8,8 @@ // test rel_ops +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include #include