diff --git a/libcxx/docs/Status/SpaceshipProjects.csv b/libcxx/docs/Status/SpaceshipProjects.csv --- a/libcxx/docs/Status/SpaceshipProjects.csv +++ b/libcxx/docs/Status/SpaceshipProjects.csv @@ -25,6 +25,8 @@ | `[unique.ptr.special] `_,| unique_ptr,[comparisons.three.way],Unassigned,|Not Started| | `[util.smartptr.shared.cmp] `_,| shared_ptr,[comparisons.three.way],Unassigned,|Not Started| | `[type.index.members] `_,| type_index,None,Unassigned,|Not Started| +| `[charconv.syn] `_,| to_chars_result,None,Mark de Wever,|Complete| +| `[charconv.syn] `_,| from_chars_result,None,Mark de Wever,|Complete| | `[stacktrace.entry.cmp] `_,| stacktrace_entry,None,Unassigned,|Not Started| | `[stacktrace.basic.cmp] `_,| basic_stacktrace,[alg.three.way],Unassigned,|Not Started| | `[string.cmp] `_,| `basic_string `_,None,Christopher Di Bella,|In Progress| diff --git a/libcxx/include/__charconv/from_chars_result.h b/libcxx/include/__charconv/from_chars_result.h --- a/libcxx/include/__charconv/from_chars_result.h +++ b/libcxx/include/__charconv/from_chars_result.h @@ -25,6 +25,9 @@ { const char* ptr; errc ec; +# if _LIBCPP_STD_VER > 17 + _LIBCPP_HIDE_FROM_ABI friend bool operator==(const from_chars_result&, const from_chars_result&) = default; +# endif }; #endif // _LIBCPP_CXX03_LANG diff --git a/libcxx/include/__charconv/to_chars_result.h b/libcxx/include/__charconv/to_chars_result.h --- a/libcxx/include/__charconv/to_chars_result.h +++ b/libcxx/include/__charconv/to_chars_result.h @@ -25,6 +25,9 @@ { char* ptr; errc ec; +# if _LIBCPP_STD_VER > 17 + _LIBCPP_HIDE_FROM_ABI friend bool operator==(const to_chars_result&, const to_chars_result&) = default; +# endif }; #endif // _LIBCPP_CXX03_LANG diff --git a/libcxx/include/charconv b/libcxx/include/charconv --- a/libcxx/include/charconv +++ b/libcxx/include/charconv @@ -27,6 +27,7 @@ struct to_chars_result { char* ptr; errc ec; + friend bool operator==(const to_chars_result&, const to_chars_result&) = default; // since C++20 }; to_chars_result to_chars(char* first, char* last, see below value, @@ -56,6 +57,7 @@ struct from_chars_result { const char* ptr; errc ec; + friend bool operator==(const from_chars_result&, const from_chars_result&) = default; // since C++20 }; from_chars_result from_chars(const char* first, const char* last, diff --git a/libcxx/test/std/utilities/charconv/charconv.syn/from_chars_result.pass.cpp b/libcxx/test/std/utilities/charconv/charconv.syn/from_chars_result.pass.cpp new file mode 100644 --- /dev/null +++ b/libcxx/test/std/utilities/charconv/charconv.syn/from_chars_result.pass.cpp @@ -0,0 +1,43 @@ +//===----------------------------------------------------------------------===// +// +// 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 +// UNSUPPORTED: libcpp-no-concepts + +// + +// struct from_chars_result +// friend bool operator==(const from_chars_result&, const from_chars_result&) = default; + +#include + +#include +#include +#include + +#include "test_macros.h" + +constexpr bool test() { + std::from_chars_result lhs{nullptr, std::errc{}}; + std::from_chars_result rhs{nullptr, std::errc{}}; + assert(lhs == rhs); + assert(!(lhs != rhs)); + + return true; +} + +int main(int, char**) { + static_assert(std::equality_comparable); + static_assert(!std::totally_ordered); + static_assert(!std::three_way_comparable); + + assert(test()); + static_assert(test()); + + return 0; +} diff --git a/libcxx/test/std/utilities/charconv/charconv.syn/to_chars_result.pass.cpp b/libcxx/test/std/utilities/charconv/charconv.syn/to_chars_result.pass.cpp new file mode 100644 --- /dev/null +++ b/libcxx/test/std/utilities/charconv/charconv.syn/to_chars_result.pass.cpp @@ -0,0 +1,43 @@ +//===----------------------------------------------------------------------===// +// +// 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 +// UNSUPPORTED: libcpp-no-concepts + +// + +// struct to_chars_result +// friend bool operator==(const to_chars_result&, const to_chars_result&) = default; + +#include + +#include +#include +#include + +#include "test_macros.h" + +constexpr bool test() { + std::to_chars_result lhs{nullptr, std::errc{}}; + std::to_chars_result rhs{nullptr, std::errc{}}; + assert(lhs == rhs); + assert(!(lhs != rhs)); + + return true; +} + +int main(int, char**) { + static_assert(std::equality_comparable); + static_assert(!std::totally_ordered); + static_assert(!std::three_way_comparable); + + assert(test()); + static_assert(test()); + + return 0; +}