diff --git a/libcxx/docs/ReleaseNotes/21.rst b/libcxx/docs/ReleaseNotes/21.rst index f67a5fced6fc5..877aa06f8b7e4 100644 --- a/libcxx/docs/ReleaseNotes/21.rst +++ b/libcxx/docs/ReleaseNotes/21.rst @@ -44,6 +44,7 @@ Implemented Papers - P2255R2: A type trait to detect reference binding to temporary (implemented the type traits only) (`Github `__) - P2562R1: ``constexpr`` Stable Sorting (`Github `__) - P1222R4: A Standard ``flat_set`` is partially implemented and ``flat_set`` is provided (`Github `__) +- P0472R3: Put std::monostate in (`Github `__) Improvements and New Features ----------------------------- diff --git a/libcxx/docs/Status/Cxx2cPapers.csv b/libcxx/docs/Status/Cxx2cPapers.csv index 9a4cd3e57e842..0cc41d2058dd5 100644 --- a/libcxx/docs/Status/Cxx2cPapers.csv +++ b/libcxx/docs/Status/Cxx2cPapers.csv @@ -102,7 +102,7 @@ "`P3475R2 `__","Defang and deprecate ``memory_order::consume``","2025-02 (Hagenberg)","","","" "`P2786R13 `__","Trivial Relocatability For C++26","2025-02 (Hagenberg)","","","" "`P3137R3 `__","``views::to_input``","2025-02 (Hagenberg)","","","" -"`P0472R3 `__","Put ``std::monostate`` in ````","2025-02 (Hagenberg)","","","" +"`P0472R3 `__","Put ``std::monostate`` in ````","2025-02 (Hagenberg)","|Complete|","21","" "`P3349R1 `__","Converting contiguous iterators to pointers","2025-02 (Hagenberg)","","","" "`P3372R3 `__","constexpr containers and adaptors","2025-02 (Hagenberg)","","","" "`P3378R2 `__","constexpr exception types","2025-02 (Hagenberg)","","","" diff --git a/libcxx/include/utility b/libcxx/include/utility index fb8a6f81350be..bc4eaf6a0cd02 100644 --- a/libcxx/include/utility +++ b/libcxx/include/utility @@ -279,6 +279,10 @@ template # include <__utility/unreachable.h> # endif +# if _LIBCPP_STD_VER >= 26 +# include <__variant/monostate.h> +# endif + # include // standard-mandated includes diff --git a/libcxx/test/libcxx/transitive_includes/cxx26.csv b/libcxx/test/libcxx/transitive_includes/cxx26.csv index c79badd3fa78f..ce8f0261f2b27 100644 --- a/libcxx/test/libcxx/transitive_includes/cxx26.csv +++ b/libcxx/test/libcxx/transitive_includes/cxx26.csv @@ -301,6 +301,7 @@ experimental/type_traits type_traits experimental/type_traits version experimental/utility compare experimental/utility cstdint +experimental/utility cstring experimental/utility initializer_list experimental/utility limits experimental/utility utility @@ -1127,6 +1128,7 @@ unordered_set tuple unordered_set version utility compare utility cstdint +utility cstring utility initializer_list utility limits utility version diff --git a/libcxx/test/std/utilities/utility/utility.monostate.relpos/relops.pass.cpp b/libcxx/test/std/utilities/utility/utility.monostate.relpos/relops.pass.cpp new file mode 100644 index 0000000000000..0f67360de7dbc --- /dev/null +++ b/libcxx/test/std/utilities/utility/utility.monostate.relpos/relops.pass.cpp @@ -0,0 +1,47 @@ +//===----------------------------------------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +// REQUIRES: std-at-least-c++26 + +// + +// constexpr bool operator<(monostate, monostate) noexcept { return false; } +// constexpr bool operator>(monostate, monostate) noexcept { return false; } +// constexpr bool operator<=(monostate, monostate) noexcept { return true; } +// constexpr bool operator>=(monostate, monostate) noexcept { return true; } +// constexpr bool operator==(monostate, monostate) noexcept { return true; } +// constexpr bool operator!=(monostate, monostate) noexcept { return false; } +// constexpr strong_ordering operator<=>(monostate, monostate) noexcept { return strong_ordering::equal; } // since C++20 + +#include +#include + +#include "test_comparisons.h" +#include "test_macros.h" + +constexpr bool test() { + using M = std::monostate; + constexpr M m1{}; + constexpr M m2{}; + assert(testComparisons(m1, m2, /*isEqual*/ true, /*isLess*/ false)); + AssertComparisonsAreNoexcept(); + +#if TEST_STD_VER > 17 + assert(testOrder(m1, m2, std::strong_ordering::equal)); + AssertOrderAreNoexcept(); +#endif // TEST_STD_VER > 17 + + return true; +} + +int main(int, char**) { + test(); + static_assert(test()); + + return 0; +} diff --git a/libcxx/test/std/utilities/utility/utility.monostate/monostate.pass.cpp b/libcxx/test/std/utilities/utility/utility.monostate/monostate.pass.cpp new file mode 100644 index 0000000000000..ca4c120ff6f68 --- /dev/null +++ b/libcxx/test/std/utilities/utility/utility.monostate/monostate.pass.cpp @@ -0,0 +1,31 @@ + +//===----------------------------------------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +// REQUIRES: std-at-least-c++26 + +// + +// struct monostate {}; + +#include +#include + +#include "test_macros.h" + +int main(int, char**) { + using M = std::monostate; + static_assert(std::is_trivially_default_constructible::value, ""); + static_assert(std::is_trivially_copy_constructible::value, ""); + static_assert(std::is_trivially_copy_assignable::value, ""); + static_assert(std::is_trivially_destructible::value, ""); + constexpr M m{}; + ((void)m); + + return 0; +}