[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