[libc++] Deprecates rel_ops. (#91642)

These operators were deprecated in
  P0768R1 Library Support for the Spaceship (Comparison) Operator

This was discovered while investigating the paper's implementation
status.
This commit is contained in:
Mark de Wever 2024-07-17 18:21:36 +02:00 committed by GitHub
parent 850a2e6874
commit 136737d947
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 45 additions and 4 deletions

View File

@ -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
----------------------------------

View File

@ -20,22 +20,22 @@ _LIBCPP_BEGIN_NAMESPACE_STD
namespace rel_ops {
template <class _Tp>
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 <class _Tp>
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 <class _Tp>
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 <class _Tp>
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);
}

View File

@ -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
//
//===----------------------------------------------------------------------===//
// <utility>
// UNSUPPORTED: c++03, c++11, c++14, c++17
#include <utility>
#include <cassert>
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}}
}

View File

@ -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 <utility> // for std::rel_ops

View File

@ -8,6 +8,8 @@
// test rel_ops
// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
#include <utility>
#include <cassert>