From 65447fdcc186be014a040135f85553e331a7a1c6 Mon Sep 17 00:00:00 2001 From: Mark de Wever Date: Wed, 8 May 2024 19:58:41 +0200 Subject: [PATCH 1/2] [libc++] Adds __cpp_lib_three_way_comparison FTM. The paper P0768R1 Library Support for the Spaceship (Comparison) Operator did not add a feature-test macro. This omission has been corrected in P1353R0 Missing Feature Test Macros This enables the FTM for P0768R1 Fixes: https://github.com/llvm/llvm-project/issues/73953 --- libcxx/docs/FeatureTestMacroTable.rst | 2 +- libcxx/docs/Status/Cxx20Papers.csv | 2 +- libcxx/include/version | 4 +- .../compare.version.compile.pass.cpp | 50 ++++++------------- .../version.version.compile.pass.cpp | 50 ++++++------------- .../generate_feature_test_macro_components.py | 4 +- 6 files changed, 38 insertions(+), 74 deletions(-) diff --git a/libcxx/docs/FeatureTestMacroTable.rst b/libcxx/docs/FeatureTestMacroTable.rst index 1032a9c338f45..381dd8569abc4 100644 --- a/libcxx/docs/FeatureTestMacroTable.rst +++ b/libcxx/docs/FeatureTestMacroTable.rst @@ -290,7 +290,7 @@ Status ---------------------------------------------------------- ----------------- ``__cpp_lib_syncbuf`` ``201803L`` ---------------------------------------------------------- ----------------- - ``__cpp_lib_three_way_comparison`` *unimplemented* + ``__cpp_lib_three_way_comparison`` ``201711L`` ---------------------------------------------------------- ----------------- ``__cpp_lib_to_address`` ``201711L`` ---------------------------------------------------------- ----------------- diff --git a/libcxx/docs/Status/Cxx20Papers.csv b/libcxx/docs/Status/Cxx20Papers.csv index d31720b7576d7..064e32a45d81a 100644 --- a/libcxx/docs/Status/Cxx20Papers.csv +++ b/libcxx/docs/Status/Cxx20Papers.csv @@ -78,7 +78,7 @@ "`P1236R1 `__","CWG","Alternative Wording for P0907R4 Signed Integers are Two's Complement","San Diego","* *","" "`P1248R1 `__","LWG","Remove CommonReference requirement from StrictWeakOrdering (a.k.a Fixing Relations)","San Diego","|Complete|","13.0" "`P1285R0 `__","LWG","Improving Completeness Requirements for Type Traits","San Diego","* *","" -"`P1353R0 `__","CWG","Missing feature test macros","San Diego","* *","" +"`P1353R0 `__","CWG","Missing feature test macros","San Diego","|In Progress|","" "","","","","","","" "`P0339R6 `__","LWG","polymorphic_allocator<> as a vocabulary type","Kona","|Complete|","16.0" "`P0340R3 `__","LWG","Making std::underlying_type SFINAE-friendly","Kona","|Complete|","9.0" diff --git a/libcxx/include/version b/libcxx/include/version index eb5fd5c805784..c7417f1be7ec8 100644 --- a/libcxx/include/version +++ b/libcxx/include/version @@ -228,7 +228,7 @@ __cpp_lib_string_view 201803L __cpp_lib_syncbuf 201803L __cpp_lib_text_encoding 202306L -__cpp_lib_three_way_comparison 201907L +__cpp_lib_three_way_comparison 201711L __cpp_lib_to_address 201711L __cpp_lib_to_array 201907L __cpp_lib_to_chars 202306L @@ -438,7 +438,7 @@ __cpp_lib_within_lifetime 202306L # if !defined(_LIBCPP_HAS_NO_EXPERIMENTAL_SYNCSTREAM) # define __cpp_lib_syncbuf 201803L # endif -// # define __cpp_lib_three_way_comparison 201907L +# define __cpp_lib_three_way_comparison 201711L # define __cpp_lib_to_address 201711L # define __cpp_lib_to_array 201907L # define __cpp_lib_type_identity 201806L diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/compare.version.compile.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/compare.version.compile.pass.cpp index f521c53250b63..aac00f20c7b45 100644 --- a/libcxx/test/std/language.support/support.limits/support.limits.general/compare.version.compile.pass.cpp +++ b/libcxx/test/std/language.support/support.limits/support.limits.general/compare.version.compile.pass.cpp @@ -16,7 +16,7 @@ // Test the feature test macros defined by /* Constant Value - __cpp_lib_three_way_comparison 201907L [C++20] + __cpp_lib_three_way_comparison 201711L [C++20] */ #include @@ -42,47 +42,29 @@ #elif TEST_STD_VER == 20 -# if !defined(_LIBCPP_VERSION) -# ifndef __cpp_lib_three_way_comparison -# error "__cpp_lib_three_way_comparison should be defined in c++20" -# endif -# if __cpp_lib_three_way_comparison != 201907L -# error "__cpp_lib_three_way_comparison should have the value 201907L in c++20" -# endif -# else // _LIBCPP_VERSION -# ifdef __cpp_lib_three_way_comparison -# error "__cpp_lib_three_way_comparison should not be defined because it is unimplemented in libc++!" -# endif +# ifndef __cpp_lib_three_way_comparison +# error "__cpp_lib_three_way_comparison should be defined in c++20" +# endif +# if __cpp_lib_three_way_comparison != 201711L +# error "__cpp_lib_three_way_comparison should have the value 201711L in c++20" # endif #elif TEST_STD_VER == 23 -# if !defined(_LIBCPP_VERSION) -# ifndef __cpp_lib_three_way_comparison -# error "__cpp_lib_three_way_comparison should be defined in c++23" -# endif -# if __cpp_lib_three_way_comparison != 201907L -# error "__cpp_lib_three_way_comparison should have the value 201907L in c++23" -# endif -# else // _LIBCPP_VERSION -# ifdef __cpp_lib_three_way_comparison -# error "__cpp_lib_three_way_comparison should not be defined because it is unimplemented in libc++!" -# endif +# ifndef __cpp_lib_three_way_comparison +# error "__cpp_lib_three_way_comparison should be defined in c++23" +# endif +# if __cpp_lib_three_way_comparison != 201711L +# error "__cpp_lib_three_way_comparison should have the value 201711L in c++23" # endif #elif TEST_STD_VER > 23 -# if !defined(_LIBCPP_VERSION) -# ifndef __cpp_lib_three_way_comparison -# error "__cpp_lib_three_way_comparison should be defined in c++26" -# endif -# if __cpp_lib_three_way_comparison != 201907L -# error "__cpp_lib_three_way_comparison should have the value 201907L in c++26" -# endif -# else // _LIBCPP_VERSION -# ifdef __cpp_lib_three_way_comparison -# error "__cpp_lib_three_way_comparison should not be defined because it is unimplemented in libc++!" -# endif +# ifndef __cpp_lib_three_way_comparison +# error "__cpp_lib_three_way_comparison should be defined in c++26" +# endif +# if __cpp_lib_three_way_comparison != 201711L +# error "__cpp_lib_three_way_comparison should have the value 201711L in c++26" # endif #endif // TEST_STD_VER > 23 diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp index da7a780528c7a..db6a7e95c31a3 100644 --- a/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp +++ b/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp @@ -210,7 +210,7 @@ __cpp_lib_submdspan 202306L [C++26] __cpp_lib_syncbuf 201803L [C++20] __cpp_lib_text_encoding 202306L [C++26] - __cpp_lib_three_way_comparison 201907L [C++20] + __cpp_lib_three_way_comparison 201711L [C++20] __cpp_lib_to_address 201711L [C++20] __cpp_lib_to_array 201907L [C++20] __cpp_lib_to_chars 201611L [C++17] @@ -4305,17 +4305,11 @@ # error "__cpp_lib_text_encoding should not be defined before c++26" # endif -# if !defined(_LIBCPP_VERSION) -# ifndef __cpp_lib_three_way_comparison -# error "__cpp_lib_three_way_comparison should be defined in c++20" -# endif -# if __cpp_lib_three_way_comparison != 201907L -# error "__cpp_lib_three_way_comparison should have the value 201907L in c++20" -# endif -# else // _LIBCPP_VERSION -# ifdef __cpp_lib_three_way_comparison -# error "__cpp_lib_three_way_comparison should not be defined because it is unimplemented in libc++!" -# endif +# ifndef __cpp_lib_three_way_comparison +# error "__cpp_lib_three_way_comparison should be defined in c++20" +# endif +# if __cpp_lib_three_way_comparison != 201711L +# error "__cpp_lib_three_way_comparison should have the value 201711L in c++20" # endif # ifndef __cpp_lib_to_address @@ -5899,17 +5893,11 @@ # error "__cpp_lib_text_encoding should not be defined before c++26" # endif -# if !defined(_LIBCPP_VERSION) -# ifndef __cpp_lib_three_way_comparison -# error "__cpp_lib_three_way_comparison should be defined in c++23" -# endif -# if __cpp_lib_three_way_comparison != 201907L -# error "__cpp_lib_three_way_comparison should have the value 201907L in c++23" -# endif -# else // _LIBCPP_VERSION -# ifdef __cpp_lib_three_way_comparison -# error "__cpp_lib_three_way_comparison should not be defined because it is unimplemented in libc++!" -# endif +# ifndef __cpp_lib_three_way_comparison +# error "__cpp_lib_three_way_comparison should be defined in c++23" +# endif +# if __cpp_lib_three_way_comparison != 201711L +# error "__cpp_lib_three_way_comparison should have the value 201711L in c++23" # endif # ifndef __cpp_lib_to_address @@ -7760,17 +7748,11 @@ # endif # endif -# if !defined(_LIBCPP_VERSION) -# ifndef __cpp_lib_three_way_comparison -# error "__cpp_lib_three_way_comparison should be defined in c++26" -# endif -# if __cpp_lib_three_way_comparison != 201907L -# error "__cpp_lib_three_way_comparison should have the value 201907L in c++26" -# endif -# else // _LIBCPP_VERSION -# ifdef __cpp_lib_three_way_comparison -# error "__cpp_lib_three_way_comparison should not be defined because it is unimplemented in libc++!" -# endif +# ifndef __cpp_lib_three_way_comparison +# error "__cpp_lib_three_way_comparison should be defined in c++26" +# endif +# if __cpp_lib_three_way_comparison != 201711L +# error "__cpp_lib_three_way_comparison should have the value 201711L in c++26" # endif # ifndef __cpp_lib_to_address diff --git a/libcxx/utils/generate_feature_test_macro_components.py b/libcxx/utils/generate_feature_test_macro_components.py index 29c8ceba0c7ef..c15658044a33f 100755 --- a/libcxx/utils/generate_feature_test_macro_components.py +++ b/libcxx/utils/generate_feature_test_macro_components.py @@ -1236,9 +1236,9 @@ def add_version_header(tc): }, { "name": "__cpp_lib_three_way_comparison", - "values": {"c++20": 201907}, + "values": {"c++20": 201711}, + # {"c++20": 201711} # P1614R2 The Mothership has Landed (see P1902R1 Missing feature-test macros 2017-2019) "headers": ["compare"], - "unimplemented": True, }, { "name": "__cpp_lib_to_address", From fbf3c54fa8a64f34cfe165338a5ca484c37c5ca9 Mon Sep 17 00:00:00 2001 From: Mark de Wever Date: Mon, 20 May 2024 15:57:10 +0200 Subject: [PATCH 2/2] Update libcxx/utils/generate_feature_test_macro_components.py Co-authored-by: S. B. Tam --- libcxx/utils/generate_feature_test_macro_components.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libcxx/utils/generate_feature_test_macro_components.py b/libcxx/utils/generate_feature_test_macro_components.py index c15658044a33f..85c18cfd84a00 100755 --- a/libcxx/utils/generate_feature_test_macro_components.py +++ b/libcxx/utils/generate_feature_test_macro_components.py @@ -1237,7 +1237,7 @@ def add_version_header(tc): { "name": "__cpp_lib_three_way_comparison", "values": {"c++20": 201711}, - # {"c++20": 201711} # P1614R2 The Mothership has Landed (see P1902R1 Missing feature-test macros 2017-2019) + # {"c++20": 201907} # P1614R2 The Mothership has Landed (see P1902R1 Missing feature-test macros 2017-2019) "headers": ["compare"], }, {