[libcxx-commits] [libcxx] [RFC][libc++] Improves feature-test marcros. (PR #88630)

via libcxx-commits libcxx-commits at lists.llvm.org
Sat Apr 13 10:57:26 PDT 2024


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-libcxx

Author: Mark de Wever (mordante)

<details>
<summary>Changes</summary>

The original feature-test macro script was written when feature-test macros were a new feature. Since that time they have become wide spread in both the language and the library. The current design has a huge draw-back; there is only one flag to determine whether a feature-test macro is implemented. This means when for a feature-test macro __cpp_lib_foo all C++20 papers are implemented, but none of the C++23 papers. This is not visible. The same when multiple papers update the same macro to the same version. At the moment this information is added as comment in the source, but not visible on the html page.

The headers and the guards are not duplicated per version. These values tend to remain the same between language versions. (Adding the macro to more headers than required is not an issue; we already always include the header version.)

Another thing that is missing is the information which papers need still to be implemented to set the macro. Recently during updating the status after a WG21 plenary I've added this as comment. This is now shown on the html page.

This update status page is intended to track the feature-test macro stage. This is not intended to be an alternative paper/LWG issue status tracker; not all papers add or modify a feature-test macro.

The intention is to only add the additional information for newer standards and not to retroactively add all entries; this information is available at
https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations#library-feature-test-macros.

The script is copied from the original and only a few entries have been converted to the new style; just to show some examples.

Note the patch only changes the rst output, adapting the other outputs would be trivial. These outputs should remain unchanged.

Note the code itself can use more polishing.

---

Patch is 68.26 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/88630.diff


3 Files Affected:

- (modified) libcxx/docs/FeatureTestMacroTable.rst (+37-440) 
- (modified) libcxx/utils/CMakeLists.txt (+5-1) 
- (added) libcxx/utils/generate_feature_test_macro_components_v2.py (+825) 


``````````diff
diff --git a/libcxx/docs/FeatureTestMacroTable.rst b/libcxx/docs/FeatureTestMacroTable.rst
index 3197d2cd1b271c..f4e39c96457785 100644
--- a/libcxx/docs/FeatureTestMacroTable.rst
+++ b/libcxx/docs/FeatureTestMacroTable.rst
@@ -11,6 +11,9 @@ Overview
 ========
 
 This file documents the feature test macros currently supported by libc++.
+For older language version not all details are available. This information can
+be found at the `isoccp
+<https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations#library-feature-test-macros>`__.
 
 .. _feature-status:
 
@@ -21,449 +24,43 @@ Status
     :name: feature-status-table
     :widths: auto
 
-    ========================================================== =================
-    Macro Name                                                 Value
-    ========================================================== =================
+    ======================= ================= ========= === ===============================================================================================================
+    Macro Name              Status            Value         Paper
+    ======================= ================= ========= === ===============================================================================================================
     **C++14**
-    ----------------------------------------------------------------------------
-    ``__cpp_lib_chrono_udls``                                  ``201304L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_complex_udls``                                 ``201309L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_exchange_function``                            ``201304L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_generic_associative_lookup``                   ``201304L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_integer_sequence``                             ``201304L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_integral_constant_callable``                   ``201304L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_is_final``                                     ``201402L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_is_null_pointer``                              ``201309L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_make_reverse_iterator``                        ``201402L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_make_unique``                                  ``201304L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_null_iterators``                               ``201304L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_quoted_string_io``                             ``201304L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_result_of_sfinae``                             ``201210L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_robust_nonmodifying_seq_ops``                  ``201304L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_shared_timed_mutex``                           ``201402L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_string_udls``                                  ``201304L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_transformation_trait_aliases``                 ``201304L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_transparent_operators``                        ``201210L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_tuple_element_t``                              ``201402L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_tuples_by_type``                               ``201304L``
-    ---------------------------------------------------------- -----------------
+    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------
     **C++17**
-    ----------------------------------------------------------------------------
-    ``__cpp_lib_addressof_constexpr``                          ``201603L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_allocator_traits_is_always_equal``             ``201411L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_any``                                          ``201606L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_apply``                                        ``201603L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_array_constexpr``                              ``201603L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_as_const``                                     ``201510L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_atomic_is_always_lock_free``                   ``201603L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_bool_constant``                                ``201505L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_boyer_moore_searcher``                         ``201603L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_byte``                                         ``201603L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_chrono``                                       ``201611L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_clamp``                                        ``201603L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_enable_shared_from_this``                      ``201603L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_execution``                                    *unimplemented*
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_filesystem``                                   ``201703L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_gcd_lcm``                                      ``201606L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_hardware_interference_size``                   ``201703L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_has_unique_object_representations``            ``201606L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_hypot``                                        ``201603L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_incomplete_container_elements``                ``201505L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_invoke``                                       ``201411L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_is_aggregate``                                 ``201703L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_is_invocable``                                 ``201703L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_is_swappable``                                 ``201603L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_launder``                                      ``201606L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_logical_traits``                               ``201510L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_make_from_tuple``                              ``201606L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_map_try_emplace``                              ``201411L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_math_special_functions``                       *unimplemented*
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_memory_resource``                              ``201603L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_node_extract``                                 ``201606L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_nonmember_container_access``                   ``201411L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_not_fn``                                       ``201603L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_optional``                                     ``201606L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_parallel_algorithm``                           *unimplemented*
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_raw_memory_algorithms``                        ``201606L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_sample``                                       ``201603L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_scoped_lock``                                  ``201703L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_shared_mutex``                                 ``201505L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_shared_ptr_arrays``                            ``201611L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_shared_ptr_weak_type``                         ``201606L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_string_view``                                  ``201606L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_to_chars``                                     *unimplemented*
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_transparent_operators``                        ``201510L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_type_trait_variable_templates``                ``201510L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_uncaught_exceptions``                          ``201411L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_unordered_map_try_emplace``                    ``201411L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_variant``                                      ``202102L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_void_t``                                       ``201411L``
-    ---------------------------------------------------------- -----------------
+    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------
+    ``__cpp_lib_any``       *201606L*         201606L   ✅
+    ----------------------- ----------------- --------- --- ---------------------------------------------------------------------------------------------------------------
+    ``__cpp_lib_variant``   *202102L*         202102L   ✅   ``std::visit`` for classes derived from ``std::variant``
+    ----------------------- ----------------- --------- --- ---------------------------------------------------------------------------------------------------------------
     **C++20**
-    ----------------------------------------------------------------------------
-    ``__cpp_lib_array_constexpr``                              ``201811L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_assume_aligned``                               ``201811L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_atomic_flag_test``                             ``201907L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_atomic_float``                                 *unimplemented*
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_atomic_lock_free_type_aliases``                ``201907L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_atomic_ref``                                   *unimplemented*
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_atomic_shared_ptr``                            *unimplemented*
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_atomic_value_initialization``                  ``201911L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_atomic_wait``                                  ``201907L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_barrier``                                      ``201907L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_bind_front``                                   ``201907L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_bit_cast``                                     ``201806L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_bitops``                                       ``201907L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_bounded_array_traits``                         ``201902L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_char8_t``                                      ``201907L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_concepts``                                     ``202002L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_constexpr_algorithms``                         ``201806L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_constexpr_complex``                            ``201711L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_constexpr_dynamic_alloc``                      ``201907L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_constexpr_functional``                         ``201907L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_constexpr_iterator``                           ``201811L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_constexpr_memory``                             ``201811L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_constexpr_numeric``                            ``201911L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_constexpr_string``                             ``201907L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_constexpr_string_view``                        ``201811L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_constexpr_tuple``                              ``201811L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_constexpr_utility``                            ``201811L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_constexpr_vector``                             ``201907L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_coroutine``                                    ``201902L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_destroying_delete``                            ``201806L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_endian``                                       ``201907L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_erase_if``                                     ``202002L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_execution``                                    *unimplemented*
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_format``                                       *unimplemented*
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_format_uchar``                                 ``202311L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_generic_unordered_lookup``                     ``201811L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_int_pow2``                                     ``202002L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_integer_comparison_functions``                 ``202002L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_interpolate``                                  ``201902L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_is_constant_evaluated``                        ``201811L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_is_layout_compatible``                         *unimplemented*
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_is_nothrow_convertible``                       ``201806L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_is_pointer_interconvertible``                  *unimplemented*
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_jthread``                                      ``201911L``
-    ---------------------------------------------------------- -----------------
-    ``__cpp_lib_latch``                                        ``201907L``
-    ----------------------------...
[truncated]

``````````

</details>


https://github.com/llvm/llvm-project/pull/88630


More information about the libcxx-commits mailing list