diff --git a/libcxx/docs/FeatureTestMacroTable.rst b/libcxx/docs/FeatureTestMacroTable.rst index 358889d8dbc37..5a3dc129e770e 100644 --- a/libcxx/docs/FeatureTestMacroTable.rst +++ b/libcxx/docs/FeatureTestMacroTable.rst @@ -514,7 +514,7 @@ Status ---------------------------------------------------------- ----------------- ``__cpp_lib_to_chars`` *unimplemented* ---------------------------------------------------------- ----------------- - ``__cpp_lib_to_string`` *unimplemented* + ``__cpp_lib_to_string`` ``202306L`` ---------------------------------------------------------- ----------------- ``__cpp_lib_tuple_like`` *unimplemented* ---------------------------------------------------------- ----------------- diff --git a/libcxx/docs/Status/Cxx2cPapers.csv b/libcxx/docs/Status/Cxx2cPapers.csv index f873d16808afe..53d9bb8f9c017 100644 --- a/libcxx/docs/Status/Cxx2cPapers.csv +++ b/libcxx/docs/Status/Cxx2cPapers.csv @@ -1,4 +1,33 @@ "Paper #","Paper Name","Meeting","Status","First released version","Notes" +<<<<<<< HEAD +"`P2497R0 `__","Testing for success or failure of ```` functions","2023-06 (Varna)","|Complete|","18","" +"`P2592R3 `__","Hashing support for ``std::chrono`` value classes","2023-06 (Varna)","","","" +"`P2587R3 `__","``to_string`` or not ``to_string``","2023-06 (Varna)","|Complete|","XX","" +"`P2562R1 `__","``constexpr`` Stable Sorting","2023-06 (Varna)","|Partial|","20","" +"`P2545R4 `__","Read-Copy Update (RCU)","2023-06 (Varna)","","","" +"`P2530R3 `__","Hazard Pointers for C++26","2023-06 (Varna)","","","" +"`P2538R1 `__","ADL-proof ``std::projected``","2023-06 (Varna)","|Complete|","18","" +"`P2495R3 `__","Interfacing ``stringstream``\s with ``string_view``","2023-06 (Varna)","|Complete|","19","" +"`P2510R3 `__","Formatting pointers","2023-06 (Varna)","|Complete|","17","Implemented as a DR against C++20. (MSVC STL and libstdc++ will do the same.)" +"`P2198R7 `__","Freestanding Feature-Test Macros and Implementation-Defined Extensions","2023-06 (Varna)","","","" +"`P2338R4 `__","Freestanding Library: Character primitives and the C library","2023-06 (Varna)","","","" +"`P2013R5 `__","Freestanding Language: Optional ``::operator new``","2023-06 (Varna)","","","" +"`P2363R5 `__","Extending associative containers with the remaining heterogeneous overloads","2023-06 (Varna)","","","" +"`P1901R2 `__","Enabling the Use of ``weak_ptr`` as Keys in Unordered Associative Containers","2023-06 (Varna)","","","" +"`P1885R12 `__","Naming Text Encodings to Demystify Them","2023-06 (Varna)","","","" +"`P0792R14 `__","``function_ref``: a type-erased callable reference","2023-06 (Varna)","","","" +"`P2874R2 `__","P2874R2: Mandating Annex D Require No More","2023-06 (Varna)","|Complete|","12","" +"`P2757R3 `__","Type-checking format args","2023-06 (Varna)","","","" +"`P2637R3 `__","Member ``visit``","2023-06 (Varna)","|Complete|","19","Change of ``__cpp_lib_variant`` is completed in LLVM 20. Change of ``__cpp_lib_format`` is blocked by `P2419R2 `__." +"`P2641R4 `__","Checking if a ``union`` alternative is active","2023-06 (Varna)","","","" +"`P1759R6 `__","Native handles and file streams","2023-06 (Varna)","|Complete|","18","" +"`P2697R1 `__","Interfacing ``bitset`` with ``string_view``","2023-06 (Varna)","|Complete|","18","" +"`P1383R2 `__","More ``constexpr`` for ```` and ````","2023-06 (Varna)","","","" +"`P2734R0 `__","Adding the new SI prefixes","2023-06 (Varna)","|Complete|","17","" +"`P2548R6 `__","``copyable_function``","2023-06 (Varna)","","","" +"`P2714R1 `__","Bind front and back to NTTP callables","2023-06 (Varna)","|Partial|","20","" +"`P2630R4 `__","``submdspan``","2023-06 (Varna)","","","" +======= "`P2497R0 `__","Testing for success or failure of ```` functions","2023-06 (Varna)","|Complete|","18","`#105357 `__","" "`P2592R3 `__","Hashing support for ``std::chrono`` value classes","2023-06 (Varna)","","","`#105358 `__","" "`P2587R3 `__","``to_string`` or not ``to_string``","2023-06 (Varna)","","","`#105359 `__","" @@ -26,6 +55,7 @@ "`P2548R6 `__","``copyable_function``","2023-06 (Varna)","","","`#105387 `__","" "`P2714R1 `__","Bind front and back to NTTP callables","2023-06 (Varna)","|Partial|","20","`#105388 `__","" "`P2630R4 `__","``submdspan``","2023-06 (Varna)","","","`#105389 `__","" +>>>>>>> main "","","","","","" "`P0543R3 `__","Saturation arithmetic","2023-11 (Kona)","|Complete|","18","`#105390 `__","" "`P2407R5 `__","Freestanding Library: Partial Classes","2023-11 (Kona)","","","`#105391 `__","" diff --git a/libcxx/include/string b/libcxx/include/string index 0abdfebcb863f..727671931f305 100644 --- a/libcxx/include/string +++ b/libcxx/include/string @@ -3912,9 +3912,20 @@ _LIBCPP_EXPORTED_FROM_ABI string to_string(long __val); _LIBCPP_EXPORTED_FROM_ABI string to_string(unsigned long __val); _LIBCPP_EXPORTED_FROM_ABI string to_string(long long __val); _LIBCPP_EXPORTED_FROM_ABI string to_string(unsigned long long __val); + +# if _LIBCPP_STD_VER >= 26 +_LIBCPP_EXPORTED_FROM_ABI string __to_string(float __val); +_LIBCPP_EXPORTED_FROM_ABI string __to_string(double __val); +_LIBCPP_EXPORTED_FROM_ABI string __to_string(long double __val); + +_LIBCPP_HIDE_FROM_ABI string to_string(float __val) { return std::__to_string(__val); } +_LIBCPP_HIDE_FROM_ABI string to_string(double __val) { return std::__to_string(__val); } +_LIBCPP_HIDE_FROM_ABI string to_string(long double __val) { return std::__to_string(__val); } +# else _LIBCPP_EXPORTED_FROM_ABI string to_string(float __val); _LIBCPP_EXPORTED_FROM_ABI string to_string(double __val); _LIBCPP_EXPORTED_FROM_ABI string to_string(long double __val); +# endif // _LIBCPP_STD_VER >= 26 # if _LIBCPP_HAS_WIDE_CHARACTERS _LIBCPP_EXPORTED_FROM_ABI int stoi(const wstring& __str, size_t* __idx = nullptr, int __base = 10); @@ -3933,9 +3944,20 @@ _LIBCPP_EXPORTED_FROM_ABI wstring to_wstring(long __val); _LIBCPP_EXPORTED_FROM_ABI wstring to_wstring(unsigned long __val); _LIBCPP_EXPORTED_FROM_ABI wstring to_wstring(long long __val); _LIBCPP_EXPORTED_FROM_ABI wstring to_wstring(unsigned long long __val); + +# if _LIBCPP_STD_VER >= 26 +_LIBCPP_EXPORTED_FROM_ABI wstring __to_wstring(float __val); +_LIBCPP_EXPORTED_FROM_ABI wstring __to_wstring(double __val); +_LIBCPP_EXPORTED_FROM_ABI wstring __to_wstring(long double __val); + +_LIBCPP_HIDE_FROM_ABI wstring to_wstring(float __val) { return std::__to_wstring(__val); } +_LIBCPP_HIDE_FROM_ABI wstring to_wstring(double __val) { return std::__to_wstring(__val); } +_LIBCPP_HIDE_FROM_ABI wstring to_wstring(long double __val) { return std::__to_wstring(__val); } +# else _LIBCPP_EXPORTED_FROM_ABI wstring to_wstring(float __val); _LIBCPP_EXPORTED_FROM_ABI wstring to_wstring(double __val); _LIBCPP_EXPORTED_FROM_ABI wstring to_wstring(long double __val); +# endif # endif // _LIBCPP_HAS_WIDE_CHARACTERS template diff --git a/libcxx/include/version b/libcxx/include/version index 16917a3bd9ddd..7422f12623964 100644 --- a/libcxx/include/version +++ b/libcxx/include/version @@ -605,7 +605,7 @@ __cpp_lib_void_t 201411L // # define __cpp_lib_text_encoding 202306L # undef __cpp_lib_to_chars // # define __cpp_lib_to_chars 202306L -// # define __cpp_lib_to_string 202306L +# define __cpp_lib_to_string 202306L # undef __cpp_lib_tuple_like // # define __cpp_lib_tuple_like 202311L # undef __cpp_lib_variant diff --git a/libcxx/src/string.cpp b/libcxx/src/string.cpp index 55d19a68802b5..b370944088566 100644 --- a/libcxx/src/string.cpp +++ b/libcxx/src/string.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -372,6 +373,16 @@ wstring to_wstring(unsigned long val) { return i_to_string(val); } wstring to_wstring(unsigned long long val) { return i_to_string(val); } #endif +_LIBCPP_EXPORTED_FROM_ABI string __to_string(float __val) { return std::format("{}", __val); } +_LIBCPP_EXPORTED_FROM_ABI string __to_string(double __val) { return std::format("{}", __val); } +_LIBCPP_EXPORTED_FROM_ABI string __to_string(long double __val) { return std::format("{}", __val); } + +#if _LIBCPP_HAS_WIDE_CHARACTERS +_LIBCPP_EXPORTED_FROM_ABI wstring __to_wstring(float __val) { return std::format(L"{}", __val); } +_LIBCPP_EXPORTED_FROM_ABI wstring __to_wstring(double __val) { return std::format(L"{}", __val); } +_LIBCPP_EXPORTED_FROM_ABI wstring __to_wstring(long double __val) { return std::format(L"{}", __val); } +#endif + string to_string(float val) { return as_string(snprintf, initial_string< string>()(), "%f", val); } string to_string(double val) { return as_string(snprintf, initial_string< string>()(), "%f", val); } string to_string(long double val) { return as_string(snprintf, initial_string< string>()(), "%Lf", val); } diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/string.version.compile.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/string.version.compile.pass.cpp index 7236d5d7f2aca..65d95762b1d88 100644 --- a/libcxx/test/std/language.support/support.limits/support.limits.general/string.version.compile.pass.cpp +++ b/libcxx/test/std/language.support/support.limits/support.limits.general/string.version.compile.pass.cpp @@ -470,6 +470,14 @@ # error "__cpp_lib_string_view should have the value 202403L in c++26" # endif +<<<<<<< HEAD +# ifndef __cpp_lib_to_string +# error "__cpp_lib_to_string should be defined in c++26" +# endif +# if __cpp_lib_to_string != 202306L +# error "__cpp_lib_to_string should have the value 202306L in c++26" +# endif +======= # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_to_string # error "__cpp_lib_to_string should be defined in c++26" @@ -482,6 +490,7 @@ # error "__cpp_lib_to_string should not be defined because it is unimplemented in libc++!" # endif # endif +>>>>>>> main #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 cde2f258b7732..14a7bd6cdf2ef 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 @@ -6157,6 +6157,1964 @@ #elif TEST_STD_VER > 23 +<<<<<<< HEAD +# ifndef __cpp_lib_adaptor_iterator_pair_constructor +# error "__cpp_lib_adaptor_iterator_pair_constructor should be defined in c++26" +# endif +# if __cpp_lib_adaptor_iterator_pair_constructor != 202106L +# error "__cpp_lib_adaptor_iterator_pair_constructor should have the value 202106L in c++26" +# endif + +# ifndef __cpp_lib_addressof_constexpr +# error "__cpp_lib_addressof_constexpr should be defined in c++26" +# endif +# if __cpp_lib_addressof_constexpr != 201603L +# error "__cpp_lib_addressof_constexpr should have the value 201603L in c++26" +# endif + +# ifndef __cpp_lib_allocate_at_least +# error "__cpp_lib_allocate_at_least should be defined in c++26" +# endif +# if __cpp_lib_allocate_at_least != 202302L +# error "__cpp_lib_allocate_at_least should have the value 202302L in c++26" +# endif + +# ifndef __cpp_lib_allocator_traits_is_always_equal +# error "__cpp_lib_allocator_traits_is_always_equal should be defined in c++26" +# endif +# if __cpp_lib_allocator_traits_is_always_equal != 201411L +# error "__cpp_lib_allocator_traits_is_always_equal should have the value 201411L in c++26" +# endif + +# ifndef __cpp_lib_any +# error "__cpp_lib_any should be defined in c++26" +# endif +# if __cpp_lib_any != 201606L +# error "__cpp_lib_any should have the value 201606L in c++26" +# endif + +# ifndef __cpp_lib_apply +# error "__cpp_lib_apply should be defined in c++26" +# endif +# if __cpp_lib_apply != 201603L +# error "__cpp_lib_apply should have the value 201603L in c++26" +# endif + +# ifndef __cpp_lib_array_constexpr +# error "__cpp_lib_array_constexpr should be defined in c++26" +# endif +# if __cpp_lib_array_constexpr != 201811L +# error "__cpp_lib_array_constexpr should have the value 201811L in c++26" +# endif + +# ifndef __cpp_lib_as_const +# error "__cpp_lib_as_const should be defined in c++26" +# endif +# if __cpp_lib_as_const != 201510L +# error "__cpp_lib_as_const should have the value 201510L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_associative_heterogeneous_erasure +# error "__cpp_lib_associative_heterogeneous_erasure should be defined in c++26" +# endif +# if __cpp_lib_associative_heterogeneous_erasure != 202110L +# error "__cpp_lib_associative_heterogeneous_erasure should have the value 202110L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_associative_heterogeneous_erasure +# error "__cpp_lib_associative_heterogeneous_erasure should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_associative_heterogeneous_insertion +# error "__cpp_lib_associative_heterogeneous_insertion should be defined in c++26" +# endif +# if __cpp_lib_associative_heterogeneous_insertion != 202306L +# error "__cpp_lib_associative_heterogeneous_insertion should have the value 202306L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_associative_heterogeneous_insertion +# error "__cpp_lib_associative_heterogeneous_insertion should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# ifndef __cpp_lib_assume_aligned +# error "__cpp_lib_assume_aligned should be defined in c++26" +# endif +# if __cpp_lib_assume_aligned != 201811L +# error "__cpp_lib_assume_aligned should have the value 201811L in c++26" +# endif + +# ifndef __cpp_lib_atomic_flag_test +# error "__cpp_lib_atomic_flag_test should be defined in c++26" +# endif +# if __cpp_lib_atomic_flag_test != 201907L +# error "__cpp_lib_atomic_flag_test should have the value 201907L in c++26" +# endif + +# ifndef __cpp_lib_atomic_float +# error "__cpp_lib_atomic_float should be defined in c++26" +# endif +# if __cpp_lib_atomic_float != 201711L +# error "__cpp_lib_atomic_float should have the value 201711L in c++26" +# endif + +# ifndef __cpp_lib_atomic_is_always_lock_free +# error "__cpp_lib_atomic_is_always_lock_free should be defined in c++26" +# endif +# if __cpp_lib_atomic_is_always_lock_free != 201603L +# error "__cpp_lib_atomic_is_always_lock_free should have the value 201603L in c++26" +# endif + +# ifndef __cpp_lib_atomic_lock_free_type_aliases +# error "__cpp_lib_atomic_lock_free_type_aliases should be defined in c++26" +# endif +# if __cpp_lib_atomic_lock_free_type_aliases != 201907L +# error "__cpp_lib_atomic_lock_free_type_aliases should have the value 201907L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_atomic_min_max +# error "__cpp_lib_atomic_min_max should be defined in c++26" +# endif +# if __cpp_lib_atomic_min_max != 202403L +# error "__cpp_lib_atomic_min_max should have the value 202403L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_atomic_min_max +# error "__cpp_lib_atomic_min_max should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# ifndef __cpp_lib_atomic_ref +# error "__cpp_lib_atomic_ref should be defined in c++26" +# endif +# if __cpp_lib_atomic_ref != 201806L +# error "__cpp_lib_atomic_ref should have the value 201806L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_atomic_shared_ptr +# error "__cpp_lib_atomic_shared_ptr should be defined in c++26" +# endif +# if __cpp_lib_atomic_shared_ptr != 201711L +# error "__cpp_lib_atomic_shared_ptr should have the value 201711L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_atomic_shared_ptr +# error "__cpp_lib_atomic_shared_ptr should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# ifndef __cpp_lib_atomic_value_initialization +# error "__cpp_lib_atomic_value_initialization should be defined in c++26" +# endif +# if __cpp_lib_atomic_value_initialization != 201911L +# error "__cpp_lib_atomic_value_initialization should have the value 201911L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) || _LIBCPP_AVAILABILITY_HAS_SYNC +# ifndef __cpp_lib_atomic_wait +# error "__cpp_lib_atomic_wait should be defined in c++26" +# endif +# if __cpp_lib_atomic_wait != 201907L +# error "__cpp_lib_atomic_wait should have the value 201907L in c++26" +# endif +# else +# ifdef __cpp_lib_atomic_wait +# error "__cpp_lib_atomic_wait should not be defined when the requirement '!defined(_LIBCPP_VERSION) || _LIBCPP_AVAILABILITY_HAS_SYNC' is not met!" +# endif +# endif + +# if !defined(_LIBCPP_VERSION) || (_LIBCPP_HAS_THREADS && _LIBCPP_AVAILABILITY_HAS_SYNC) +# ifndef __cpp_lib_barrier +# error "__cpp_lib_barrier should be defined in c++26" +# endif +# if __cpp_lib_barrier != 201907L +# error "__cpp_lib_barrier should have the value 201907L in c++26" +# endif +# else +# ifdef __cpp_lib_barrier +# error "__cpp_lib_barrier should not be defined when the requirement '!defined(_LIBCPP_VERSION) || (_LIBCPP_HAS_THREADS && _LIBCPP_AVAILABILITY_HAS_SYNC)' is not met!" +# endif +# endif + +# ifndef __cpp_lib_bind_back +# error "__cpp_lib_bind_back should be defined in c++26" +# endif +# if __cpp_lib_bind_back != 202202L +# error "__cpp_lib_bind_back should have the value 202202L in c++26" +# endif + +# ifndef __cpp_lib_bind_front +# error "__cpp_lib_bind_front should be defined in c++26" +# endif +# if __cpp_lib_bind_front != 202306L +# error "__cpp_lib_bind_front should have the value 202306L in c++26" +# endif + +# ifndef __cpp_lib_bit_cast +# error "__cpp_lib_bit_cast should be defined in c++26" +# endif +# if __cpp_lib_bit_cast != 201806L +# error "__cpp_lib_bit_cast should have the value 201806L in c++26" +# endif + +# ifndef __cpp_lib_bitops +# error "__cpp_lib_bitops should be defined in c++26" +# endif +# if __cpp_lib_bitops != 201907L +# error "__cpp_lib_bitops should have the value 201907L in c++26" +# endif + +# ifndef __cpp_lib_bitset +# error "__cpp_lib_bitset should be defined in c++26" +# endif +# if __cpp_lib_bitset != 202306L +# error "__cpp_lib_bitset should have the value 202306L in c++26" +# endif + +# ifndef __cpp_lib_bool_constant +# error "__cpp_lib_bool_constant should be defined in c++26" +# endif +# if __cpp_lib_bool_constant != 201505L +# error "__cpp_lib_bool_constant should have the value 201505L in c++26" +# endif + +# ifndef __cpp_lib_bounded_array_traits +# error "__cpp_lib_bounded_array_traits should be defined in c++26" +# endif +# if __cpp_lib_bounded_array_traits != 201902L +# error "__cpp_lib_bounded_array_traits should have the value 201902L in c++26" +# endif + +# ifndef __cpp_lib_boyer_moore_searcher +# error "__cpp_lib_boyer_moore_searcher should be defined in c++26" +# endif +# if __cpp_lib_boyer_moore_searcher != 201603L +# error "__cpp_lib_boyer_moore_searcher should have the value 201603L in c++26" +# endif + +# ifndef __cpp_lib_byte +# error "__cpp_lib_byte should be defined in c++26" +# endif +# if __cpp_lib_byte != 201603L +# error "__cpp_lib_byte should have the value 201603L in c++26" +# endif + +# ifndef __cpp_lib_byteswap +# error "__cpp_lib_byteswap should be defined in c++26" +# endif +# if __cpp_lib_byteswap != 202110L +# error "__cpp_lib_byteswap should have the value 202110L in c++26" +# endif + +# if defined(__cpp_char8_t) +# ifndef __cpp_lib_char8_t +# error "__cpp_lib_char8_t should be defined in c++26" +# endif +# if __cpp_lib_char8_t != 201907L +# error "__cpp_lib_char8_t should have the value 201907L in c++26" +# endif +# else +# ifdef __cpp_lib_char8_t +# error "__cpp_lib_char8_t should not be defined when the requirement 'defined(__cpp_char8_t)' is not met!" +# endif +# endif + +# ifndef __cpp_lib_chrono +# error "__cpp_lib_chrono should be defined in c++26" +# endif +# if __cpp_lib_chrono != 201611L +# error "__cpp_lib_chrono should have the value 201611L in c++26" +# endif + +# ifndef __cpp_lib_chrono_udls +# error "__cpp_lib_chrono_udls should be defined in c++26" +# endif +# if __cpp_lib_chrono_udls != 201304L +# error "__cpp_lib_chrono_udls should have the value 201304L in c++26" +# endif + +# ifndef __cpp_lib_clamp +# error "__cpp_lib_clamp should be defined in c++26" +# endif +# if __cpp_lib_clamp != 201603L +# error "__cpp_lib_clamp should have the value 201603L in c++26" +# endif + +# ifndef __cpp_lib_complex_udls +# error "__cpp_lib_complex_udls should be defined in c++26" +# endif +# if __cpp_lib_complex_udls != 201309L +# error "__cpp_lib_complex_udls should have the value 201309L in c++26" +# endif + +# ifndef __cpp_lib_concepts +# error "__cpp_lib_concepts should be defined in c++26" +# endif +# if __cpp_lib_concepts != 202002L +# error "__cpp_lib_concepts should have the value 202002L in c++26" +# endif + +# ifndef __cpp_lib_constexpr_algorithms +# error "__cpp_lib_constexpr_algorithms should be defined in c++26" +# endif +# if __cpp_lib_constexpr_algorithms != 201806L +# error "__cpp_lib_constexpr_algorithms should have the value 201806L in c++26" +# endif + +# ifndef __cpp_lib_constexpr_bitset +# error "__cpp_lib_constexpr_bitset should be defined in c++26" +# endif +# if __cpp_lib_constexpr_bitset != 202207L +# error "__cpp_lib_constexpr_bitset should have the value 202207L in c++26" +# endif + +# ifndef __cpp_lib_constexpr_charconv +# error "__cpp_lib_constexpr_charconv should be defined in c++26" +# endif +# if __cpp_lib_constexpr_charconv != 202207L +# error "__cpp_lib_constexpr_charconv should have the value 202207L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_constexpr_cmath +# error "__cpp_lib_constexpr_cmath should be defined in c++26" +# endif +# if __cpp_lib_constexpr_cmath != 202202L +# error "__cpp_lib_constexpr_cmath should have the value 202202L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_constexpr_cmath +# error "__cpp_lib_constexpr_cmath should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# ifndef __cpp_lib_constexpr_complex +# error "__cpp_lib_constexpr_complex should be defined in c++26" +# endif +# if __cpp_lib_constexpr_complex != 201711L +# error "__cpp_lib_constexpr_complex should have the value 201711L in c++26" +# endif + +# ifndef __cpp_lib_constexpr_dynamic_alloc +# error "__cpp_lib_constexpr_dynamic_alloc should be defined in c++26" +# endif +# if __cpp_lib_constexpr_dynamic_alloc != 201907L +# error "__cpp_lib_constexpr_dynamic_alloc should have the value 201907L in c++26" +# endif + +# ifndef __cpp_lib_constexpr_functional +# error "__cpp_lib_constexpr_functional should be defined in c++26" +# endif +# if __cpp_lib_constexpr_functional != 201907L +# error "__cpp_lib_constexpr_functional should have the value 201907L in c++26" +# endif + +# ifndef __cpp_lib_constexpr_iterator +# error "__cpp_lib_constexpr_iterator should be defined in c++26" +# endif +# if __cpp_lib_constexpr_iterator != 201811L +# error "__cpp_lib_constexpr_iterator should have the value 201811L in c++26" +# endif + +# ifndef __cpp_lib_constexpr_memory +# error "__cpp_lib_constexpr_memory should be defined in c++26" +# endif +# if __cpp_lib_constexpr_memory != 202202L +# error "__cpp_lib_constexpr_memory should have the value 202202L in c++26" +# endif + +# if !defined(_LIBCPP_ABI_VCRUNTIME) +# ifndef __cpp_lib_constexpr_new +# error "__cpp_lib_constexpr_new should be defined in c++26" +# endif +# if __cpp_lib_constexpr_new != 202406L +# error "__cpp_lib_constexpr_new should have the value 202406L in c++26" +# endif +# else +# ifdef __cpp_lib_constexpr_new +# error "__cpp_lib_constexpr_new should not be defined when the requirement '!defined(_LIBCPP_ABI_VCRUNTIME)' is not met!" +# endif +# endif + +# ifndef __cpp_lib_constexpr_numeric +# error "__cpp_lib_constexpr_numeric should be defined in c++26" +# endif +# if __cpp_lib_constexpr_numeric != 201911L +# error "__cpp_lib_constexpr_numeric should have the value 201911L in c++26" +# endif + +# ifndef __cpp_lib_constexpr_string +# error "__cpp_lib_constexpr_string should be defined in c++26" +# endif +# if __cpp_lib_constexpr_string != 201907L +# error "__cpp_lib_constexpr_string should have the value 201907L in c++26" +# endif + +# ifndef __cpp_lib_constexpr_string_view +# error "__cpp_lib_constexpr_string_view should be defined in c++26" +# endif +# if __cpp_lib_constexpr_string_view != 201811L +# error "__cpp_lib_constexpr_string_view should have the value 201811L in c++26" +# endif + +# ifndef __cpp_lib_constexpr_tuple +# error "__cpp_lib_constexpr_tuple should be defined in c++26" +# endif +# if __cpp_lib_constexpr_tuple != 201811L +# error "__cpp_lib_constexpr_tuple should have the value 201811L in c++26" +# endif + +# ifndef __cpp_lib_constexpr_typeinfo +# error "__cpp_lib_constexpr_typeinfo should be defined in c++26" +# endif +# if __cpp_lib_constexpr_typeinfo != 202106L +# error "__cpp_lib_constexpr_typeinfo should have the value 202106L in c++26" +# endif + +# ifndef __cpp_lib_constexpr_utility +# error "__cpp_lib_constexpr_utility should be defined in c++26" +# endif +# if __cpp_lib_constexpr_utility != 201811L +# error "__cpp_lib_constexpr_utility should have the value 201811L in c++26" +# endif + +# ifndef __cpp_lib_constexpr_vector +# error "__cpp_lib_constexpr_vector should be defined in c++26" +# endif +# if __cpp_lib_constexpr_vector != 201907L +# error "__cpp_lib_constexpr_vector should have the value 201907L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should be defined in c++26" +# endif +# if __cpp_lib_constrained_equality != 202403L +# error "__cpp_lib_constrained_equality should have the value 202403L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_constrained_equality +# error "__cpp_lib_constrained_equality should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# ifndef __cpp_lib_containers_ranges +# error "__cpp_lib_containers_ranges should be defined in c++26" +# endif +# if __cpp_lib_containers_ranges != 202202L +# error "__cpp_lib_containers_ranges should have the value 202202L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_copyable_function +# error "__cpp_lib_copyable_function should be defined in c++26" +# endif +# if __cpp_lib_copyable_function != 202306L +# error "__cpp_lib_copyable_function should have the value 202306L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_copyable_function +# error "__cpp_lib_copyable_function should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# ifndef __cpp_lib_coroutine +# error "__cpp_lib_coroutine should be defined in c++26" +# endif +# if __cpp_lib_coroutine != 201902L +# error "__cpp_lib_coroutine should have the value 201902L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_debugging +# error "__cpp_lib_debugging should be defined in c++26" +# endif +# if __cpp_lib_debugging != 202311L +# error "__cpp_lib_debugging should have the value 202311L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_debugging +# error "__cpp_lib_debugging should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should be defined in c++26" +# endif +# if __cpp_lib_default_template_type_for_algorithm_values != 202403L +# error "__cpp_lib_default_template_type_for_algorithm_values should have the value 202403L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_default_template_type_for_algorithm_values +# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# if TEST_STD_VER > 17 && defined(__cpp_impl_destroying_delete) && __cpp_impl_destroying_delete >= 201806L +# ifndef __cpp_lib_destroying_delete +# error "__cpp_lib_destroying_delete should be defined in c++26" +# endif +# if __cpp_lib_destroying_delete != 201806L +# error "__cpp_lib_destroying_delete should have the value 201806L in c++26" +# endif +# else +# ifdef __cpp_lib_destroying_delete +# error "__cpp_lib_destroying_delete should not be defined when the requirement 'TEST_STD_VER > 17 && defined(__cpp_impl_destroying_delete) && __cpp_impl_destroying_delete >= 201806L' is not met!" +# endif +# endif + +# ifndef __cpp_lib_enable_shared_from_this +# error "__cpp_lib_enable_shared_from_this should be defined in c++26" +# endif +# if __cpp_lib_enable_shared_from_this != 201603L +# error "__cpp_lib_enable_shared_from_this should have the value 201603L in c++26" +# endif + +# ifndef __cpp_lib_endian +# error "__cpp_lib_endian should be defined in c++26" +# endif +# if __cpp_lib_endian != 201907L +# error "__cpp_lib_endian should have the value 201907L in c++26" +# endif + +# ifndef __cpp_lib_erase_if +# error "__cpp_lib_erase_if should be defined in c++26" +# endif +# if __cpp_lib_erase_if != 202002L +# error "__cpp_lib_erase_if should have the value 202002L in c++26" +# endif + +# ifndef __cpp_lib_exchange_function +# error "__cpp_lib_exchange_function should be defined in c++26" +# endif +# if __cpp_lib_exchange_function != 201304L +# error "__cpp_lib_exchange_function should have the value 201304L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_execution +# error "__cpp_lib_execution should be defined in c++26" +# endif +# if __cpp_lib_execution != 201902L +# error "__cpp_lib_execution should have the value 201902L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_execution +# error "__cpp_lib_execution should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# ifndef __cpp_lib_expected +# error "__cpp_lib_expected should be defined in c++26" +# endif +# if __cpp_lib_expected != 202211L +# error "__cpp_lib_expected should have the value 202211L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) || (_LIBCPP_HAS_FILESYSTEM && _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_LIBRARY) +# ifndef __cpp_lib_filesystem +# error "__cpp_lib_filesystem should be defined in c++26" +# endif +# if __cpp_lib_filesystem != 201703L +# error "__cpp_lib_filesystem should have the value 201703L in c++26" +# endif +# else +# ifdef __cpp_lib_filesystem +# error "__cpp_lib_filesystem should not be defined when the requirement '!defined(_LIBCPP_VERSION) || (_LIBCPP_HAS_FILESYSTEM && _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_LIBRARY)' is not met!" +# endif +# endif + +# ifndef __cpp_lib_flat_map +# error "__cpp_lib_flat_map should be defined in c++26" +# endif +# if __cpp_lib_flat_map != 202207L +# error "__cpp_lib_flat_map should have the value 202207L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_flat_set +# error "__cpp_lib_flat_set should be defined in c++26" +# endif +# if __cpp_lib_flat_set != 202207L +# error "__cpp_lib_flat_set should have the value 202207L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_flat_set +# error "__cpp_lib_flat_set should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# if !defined(_LIBCPP_VERSION) || _LIBCPP_AVAILABILITY_HAS_TO_CHARS_FLOATING_POINT +# ifndef __cpp_lib_format +# error "__cpp_lib_format should be defined in c++26" +# endif +# if __cpp_lib_format != 202110L +# error "__cpp_lib_format should have the value 202110L in c++26" +# endif +# else +# ifdef __cpp_lib_format +# error "__cpp_lib_format should not be defined when the requirement '!defined(_LIBCPP_VERSION) || _LIBCPP_AVAILABILITY_HAS_TO_CHARS_FLOATING_POINT' is not met!" +# endif +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_format_path +# error "__cpp_lib_format_path should be defined in c++26" +# endif +# if __cpp_lib_format_path != 202403L +# error "__cpp_lib_format_path should have the value 202403L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_format_path +# error "__cpp_lib_format_path should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# ifndef __cpp_lib_format_ranges +# error "__cpp_lib_format_ranges should be defined in c++26" +# endif +# if __cpp_lib_format_ranges != 202207L +# error "__cpp_lib_format_ranges should have the value 202207L in c++26" +# endif + +# ifndef __cpp_lib_format_uchar +# error "__cpp_lib_format_uchar should be defined in c++26" +# endif +# if __cpp_lib_format_uchar != 202311L +# error "__cpp_lib_format_uchar should have the value 202311L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_formatters +# error "__cpp_lib_formatters should be defined in c++26" +# endif +# if __cpp_lib_formatters != 202302L +# error "__cpp_lib_formatters should have the value 202302L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_formatters +# error "__cpp_lib_formatters should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# ifndef __cpp_lib_forward_like +# error "__cpp_lib_forward_like should be defined in c++26" +# endif +# if __cpp_lib_forward_like != 202207L +# error "__cpp_lib_forward_like should have the value 202207L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_freestanding_algorithm +# error "__cpp_lib_freestanding_algorithm should be defined in c++26" +# endif +# if __cpp_lib_freestanding_algorithm != 202311L +# error "__cpp_lib_freestanding_algorithm should have the value 202311L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_freestanding_algorithm +# error "__cpp_lib_freestanding_algorithm should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_freestanding_array +# error "__cpp_lib_freestanding_array should be defined in c++26" +# endif +# if __cpp_lib_freestanding_array != 202311L +# error "__cpp_lib_freestanding_array should have the value 202311L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_freestanding_array +# error "__cpp_lib_freestanding_array should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_freestanding_cstring +# error "__cpp_lib_freestanding_cstring should be defined in c++26" +# endif +# if __cpp_lib_freestanding_cstring != 202306L +# error "__cpp_lib_freestanding_cstring should have the value 202306L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_freestanding_cstring +# error "__cpp_lib_freestanding_cstring should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_freestanding_expected +# error "__cpp_lib_freestanding_expected should be defined in c++26" +# endif +# if __cpp_lib_freestanding_expected != 202311L +# error "__cpp_lib_freestanding_expected should have the value 202311L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_freestanding_expected +# error "__cpp_lib_freestanding_expected should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_freestanding_mdspan +# error "__cpp_lib_freestanding_mdspan should be defined in c++26" +# endif +# if __cpp_lib_freestanding_mdspan != 202311L +# error "__cpp_lib_freestanding_mdspan should have the value 202311L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_freestanding_mdspan +# error "__cpp_lib_freestanding_mdspan should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_freestanding_optional +# error "__cpp_lib_freestanding_optional should be defined in c++26" +# endif +# if __cpp_lib_freestanding_optional != 202311L +# error "__cpp_lib_freestanding_optional should have the value 202311L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_freestanding_optional +# error "__cpp_lib_freestanding_optional should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_freestanding_string_view +# error "__cpp_lib_freestanding_string_view should be defined in c++26" +# endif +# if __cpp_lib_freestanding_string_view != 202311L +# error "__cpp_lib_freestanding_string_view should have the value 202311L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_freestanding_string_view +# error "__cpp_lib_freestanding_string_view should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_freestanding_variant +# error "__cpp_lib_freestanding_variant should be defined in c++26" +# endif +# if __cpp_lib_freestanding_variant != 202311L +# error "__cpp_lib_freestanding_variant should have the value 202311L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_freestanding_variant +# error "__cpp_lib_freestanding_variant should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# if !defined(_LIBCPP_VERSION) || (_LIBCPP_HAS_FILESYSTEM && _LIBCPP_HAS_LOCALIZATION) +# ifndef __cpp_lib_fstream_native_handle +# error "__cpp_lib_fstream_native_handle should be defined in c++26" +# endif +# if __cpp_lib_fstream_native_handle != 202306L +# error "__cpp_lib_fstream_native_handle should have the value 202306L in c++26" +# endif +# else +# ifdef __cpp_lib_fstream_native_handle +# error "__cpp_lib_fstream_native_handle should not be defined when the requirement '!defined(_LIBCPP_VERSION) || (_LIBCPP_HAS_FILESYSTEM && _LIBCPP_HAS_LOCALIZATION)' is not met!" +# endif +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_function_ref +# error "__cpp_lib_function_ref should be defined in c++26" +# endif +# if __cpp_lib_function_ref != 202306L +# error "__cpp_lib_function_ref should have the value 202306L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_function_ref +# error "__cpp_lib_function_ref should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# ifndef __cpp_lib_gcd_lcm +# error "__cpp_lib_gcd_lcm should be defined in c++26" +# endif +# if __cpp_lib_gcd_lcm != 201606L +# error "__cpp_lib_gcd_lcm should have the value 201606L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_generate_random +# error "__cpp_lib_generate_random should be defined in c++26" +# endif +# if __cpp_lib_generate_random != 202403L +# error "__cpp_lib_generate_random should have the value 202403L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_generate_random +# error "__cpp_lib_generate_random should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# ifndef __cpp_lib_generic_associative_lookup +# error "__cpp_lib_generic_associative_lookup should be defined in c++26" +# endif +# if __cpp_lib_generic_associative_lookup != 201304L +# error "__cpp_lib_generic_associative_lookup should have the value 201304L in c++26" +# endif + +# ifndef __cpp_lib_generic_unordered_lookup +# error "__cpp_lib_generic_unordered_lookup should be defined in c++26" +# endif +# if __cpp_lib_generic_unordered_lookup != 201811L +# error "__cpp_lib_generic_unordered_lookup should have the value 201811L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) || (defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE)) +# ifndef __cpp_lib_hardware_interference_size +# error "__cpp_lib_hardware_interference_size should be defined in c++26" +# endif +# if __cpp_lib_hardware_interference_size != 201703L +# error "__cpp_lib_hardware_interference_size should have the value 201703L in c++26" +# endif +# else +# ifdef __cpp_lib_hardware_interference_size +# error "__cpp_lib_hardware_interference_size should not be defined when the requirement '!defined(_LIBCPP_VERSION) || (defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE))' is not met!" +# endif +# endif + +# ifndef __cpp_lib_has_unique_object_representations +# error "__cpp_lib_has_unique_object_representations should be defined in c++26" +# endif +# if __cpp_lib_has_unique_object_representations != 201606L +# error "__cpp_lib_has_unique_object_representations should have the value 201606L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_hazard_pointer +# error "__cpp_lib_hazard_pointer should be defined in c++26" +# endif +# if __cpp_lib_hazard_pointer != 202306L +# error "__cpp_lib_hazard_pointer should have the value 202306L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_hazard_pointer +# error "__cpp_lib_hazard_pointer should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# ifndef __cpp_lib_hypot +# error "__cpp_lib_hypot should be defined in c++26" +# endif +# if __cpp_lib_hypot != 201603L +# error "__cpp_lib_hypot should have the value 201603L in c++26" +# endif + +# ifndef __cpp_lib_incomplete_container_elements +# error "__cpp_lib_incomplete_container_elements should be defined in c++26" +# endif +# if __cpp_lib_incomplete_container_elements != 201505L +# error "__cpp_lib_incomplete_container_elements should have the value 201505L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_inplace_vector +# error "__cpp_lib_inplace_vector should be defined in c++26" +# endif +# if __cpp_lib_inplace_vector != 202406L +# error "__cpp_lib_inplace_vector should have the value 202406L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_inplace_vector +# error "__cpp_lib_inplace_vector should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# ifndef __cpp_lib_int_pow2 +# error "__cpp_lib_int_pow2 should be defined in c++26" +# endif +# if __cpp_lib_int_pow2 != 202002L +# error "__cpp_lib_int_pow2 should have the value 202002L in c++26" +# endif + +# ifndef __cpp_lib_integer_comparison_functions +# error "__cpp_lib_integer_comparison_functions should be defined in c++26" +# endif +# if __cpp_lib_integer_comparison_functions != 202002L +# error "__cpp_lib_integer_comparison_functions should have the value 202002L in c++26" +# endif + +# ifndef __cpp_lib_integer_sequence +# error "__cpp_lib_integer_sequence should be defined in c++26" +# endif +# if __cpp_lib_integer_sequence != 201304L +# error "__cpp_lib_integer_sequence should have the value 201304L in c++26" +# endif + +# ifndef __cpp_lib_integral_constant_callable +# error "__cpp_lib_integral_constant_callable should be defined in c++26" +# endif +# if __cpp_lib_integral_constant_callable != 201304L +# error "__cpp_lib_integral_constant_callable should have the value 201304L in c++26" +# endif + +# ifndef __cpp_lib_interpolate +# error "__cpp_lib_interpolate should be defined in c++26" +# endif +# if __cpp_lib_interpolate != 201902L +# error "__cpp_lib_interpolate should have the value 201902L in c++26" +# endif + +# ifndef __cpp_lib_invoke +# error "__cpp_lib_invoke should be defined in c++26" +# endif +# if __cpp_lib_invoke != 201411L +# error "__cpp_lib_invoke should have the value 201411L in c++26" +# endif + +# ifndef __cpp_lib_invoke_r +# error "__cpp_lib_invoke_r should be defined in c++26" +# endif +# if __cpp_lib_invoke_r != 202106L +# error "__cpp_lib_invoke_r should have the value 202106L in c++26" +# endif + +# ifndef __cpp_lib_ios_noreplace +# error "__cpp_lib_ios_noreplace should be defined in c++26" +# endif +# if __cpp_lib_ios_noreplace != 202207L +# error "__cpp_lib_ios_noreplace should have the value 202207L in c++26" +# endif + +# ifndef __cpp_lib_is_aggregate +# error "__cpp_lib_is_aggregate should be defined in c++26" +# endif +# if __cpp_lib_is_aggregate != 201703L +# error "__cpp_lib_is_aggregate should have the value 201703L in c++26" +# endif + +# ifndef __cpp_lib_is_constant_evaluated +# error "__cpp_lib_is_constant_evaluated should be defined in c++26" +# endif +# if __cpp_lib_is_constant_evaluated != 201811L +# error "__cpp_lib_is_constant_evaluated should have the value 201811L in c++26" +# endif + +# ifndef __cpp_lib_is_final +# error "__cpp_lib_is_final should be defined in c++26" +# endif +# if __cpp_lib_is_final != 201402L +# error "__cpp_lib_is_final should have the value 201402L in c++26" +# endif + +# if __has_builtin(__builtin_is_implicit_lifetime) +# ifndef __cpp_lib_is_implicit_lifetime +# error "__cpp_lib_is_implicit_lifetime should be defined in c++26" +# endif +# if __cpp_lib_is_implicit_lifetime != 202302L +# error "__cpp_lib_is_implicit_lifetime should have the value 202302L in c++26" +# endif +# else +# ifdef __cpp_lib_is_implicit_lifetime +# error "__cpp_lib_is_implicit_lifetime should not be defined when the requirement '__has_builtin(__builtin_is_implicit_lifetime)' is not met!" +# endif +# endif + +# ifndef __cpp_lib_is_invocable +# error "__cpp_lib_is_invocable should be defined in c++26" +# endif +# if __cpp_lib_is_invocable != 201703L +# error "__cpp_lib_is_invocable should have the value 201703L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_is_layout_compatible +# error "__cpp_lib_is_layout_compatible should be defined in c++26" +# endif +# if __cpp_lib_is_layout_compatible != 201907L +# error "__cpp_lib_is_layout_compatible should have the value 201907L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_is_layout_compatible +# error "__cpp_lib_is_layout_compatible should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# ifndef __cpp_lib_is_nothrow_convertible +# error "__cpp_lib_is_nothrow_convertible should be defined in c++26" +# endif +# if __cpp_lib_is_nothrow_convertible != 201806L +# error "__cpp_lib_is_nothrow_convertible should have the value 201806L in c++26" +# endif + +# ifndef __cpp_lib_is_null_pointer +# error "__cpp_lib_is_null_pointer should be defined in c++26" +# endif +# if __cpp_lib_is_null_pointer != 201309L +# error "__cpp_lib_is_null_pointer should have the value 201309L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_is_pointer_interconvertible +# error "__cpp_lib_is_pointer_interconvertible should be defined in c++26" +# endif +# if __cpp_lib_is_pointer_interconvertible != 201907L +# error "__cpp_lib_is_pointer_interconvertible should have the value 201907L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_is_pointer_interconvertible +# error "__cpp_lib_is_pointer_interconvertible should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# ifndef __cpp_lib_is_scoped_enum +# error "__cpp_lib_is_scoped_enum should be defined in c++26" +# endif +# if __cpp_lib_is_scoped_enum != 202011L +# error "__cpp_lib_is_scoped_enum should have the value 202011L in c++26" +# endif + +# ifndef __cpp_lib_is_swappable +# error "__cpp_lib_is_swappable should be defined in c++26" +# endif +# if __cpp_lib_is_swappable != 201603L +# error "__cpp_lib_is_swappable should have the value 201603L in c++26" +# endif + +# if __has_builtin(__builtin_is_virtual_base_of) +# ifndef __cpp_lib_is_virtual_base_of +# error "__cpp_lib_is_virtual_base_of should be defined in c++26" +# endif +# if __cpp_lib_is_virtual_base_of != 202406L +# error "__cpp_lib_is_virtual_base_of should have the value 202406L in c++26" +# endif +# else +# ifdef __cpp_lib_is_virtual_base_of +# error "__cpp_lib_is_virtual_base_of should not be defined when the requirement '__has_builtin(__builtin_is_virtual_base_of)' is not met!" +# endif +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_is_within_lifetime +# error "__cpp_lib_is_within_lifetime should be defined in c++26" +# endif +# if __cpp_lib_is_within_lifetime != 202306L +# error "__cpp_lib_is_within_lifetime should have the value 202306L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_is_within_lifetime +# error "__cpp_lib_is_within_lifetime should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# if !defined(_LIBCPP_VERSION) || (_LIBCPP_HAS_THREADS && _LIBCPP_AVAILABILITY_HAS_SYNC) +# ifndef __cpp_lib_jthread +# error "__cpp_lib_jthread should be defined in c++26" +# endif +# if __cpp_lib_jthread != 201911L +# error "__cpp_lib_jthread should have the value 201911L in c++26" +# endif +# else +# ifdef __cpp_lib_jthread +# error "__cpp_lib_jthread should not be defined when the requirement '!defined(_LIBCPP_VERSION) || (_LIBCPP_HAS_THREADS && _LIBCPP_AVAILABILITY_HAS_SYNC)' is not met!" +# endif +# endif + +# if !defined(_LIBCPP_VERSION) || (_LIBCPP_HAS_THREADS && _LIBCPP_AVAILABILITY_HAS_SYNC) +# ifndef __cpp_lib_latch +# error "__cpp_lib_latch should be defined in c++26" +# endif +# if __cpp_lib_latch != 201907L +# error "__cpp_lib_latch should have the value 201907L in c++26" +# endif +# else +# ifdef __cpp_lib_latch +# error "__cpp_lib_latch should not be defined when the requirement '!defined(_LIBCPP_VERSION) || (_LIBCPP_HAS_THREADS && _LIBCPP_AVAILABILITY_HAS_SYNC)' is not met!" +# endif +# endif + +# ifndef __cpp_lib_launder +# error "__cpp_lib_launder should be defined in c++26" +# endif +# if __cpp_lib_launder != 201606L +# error "__cpp_lib_launder should have the value 201606L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_linalg +# error "__cpp_lib_linalg should be defined in c++26" +# endif +# if __cpp_lib_linalg != 202311L +# error "__cpp_lib_linalg should have the value 202311L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_linalg +# error "__cpp_lib_linalg should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# ifndef __cpp_lib_list_remove_return_type +# error "__cpp_lib_list_remove_return_type should be defined in c++26" +# endif +# if __cpp_lib_list_remove_return_type != 201806L +# error "__cpp_lib_list_remove_return_type should have the value 201806L in c++26" +# endif + +# ifndef __cpp_lib_logical_traits +# error "__cpp_lib_logical_traits should be defined in c++26" +# endif +# if __cpp_lib_logical_traits != 201510L +# error "__cpp_lib_logical_traits should have the value 201510L in c++26" +# endif + +# ifndef __cpp_lib_make_from_tuple +# error "__cpp_lib_make_from_tuple should be defined in c++26" +# endif +# if __cpp_lib_make_from_tuple != 201606L +# error "__cpp_lib_make_from_tuple should have the value 201606L in c++26" +# endif + +# ifndef __cpp_lib_make_reverse_iterator +# error "__cpp_lib_make_reverse_iterator should be defined in c++26" +# endif +# if __cpp_lib_make_reverse_iterator != 201402L +# error "__cpp_lib_make_reverse_iterator should have the value 201402L in c++26" +# endif + +# ifndef __cpp_lib_make_unique +# error "__cpp_lib_make_unique should be defined in c++26" +# endif +# if __cpp_lib_make_unique != 201304L +# error "__cpp_lib_make_unique should have the value 201304L in c++26" +# endif + +# ifndef __cpp_lib_map_try_emplace +# error "__cpp_lib_map_try_emplace should be defined in c++26" +# endif +# if __cpp_lib_map_try_emplace != 201411L +# error "__cpp_lib_map_try_emplace should have the value 201411L in c++26" +# endif + +# ifndef __cpp_lib_math_constants +# error "__cpp_lib_math_constants should be defined in c++26" +# endif +# if __cpp_lib_math_constants != 201907L +# error "__cpp_lib_math_constants should have the value 201907L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_math_special_functions +# error "__cpp_lib_math_special_functions should be defined in c++26" +# endif +# if __cpp_lib_math_special_functions != 201603L +# error "__cpp_lib_math_special_functions should have the value 201603L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_math_special_functions +# error "__cpp_lib_math_special_functions should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# ifndef __cpp_lib_mdspan +# error "__cpp_lib_mdspan should be defined in c++26" +# endif +# if __cpp_lib_mdspan != 202406L +# error "__cpp_lib_mdspan should have the value 202406L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) || _LIBCPP_AVAILABILITY_HAS_PMR +# ifndef __cpp_lib_memory_resource +# error "__cpp_lib_memory_resource should be defined in c++26" +# endif +# if __cpp_lib_memory_resource != 201603L +# error "__cpp_lib_memory_resource should have the value 201603L in c++26" +# endif +# else +# ifdef __cpp_lib_memory_resource +# error "__cpp_lib_memory_resource should not be defined when the requirement '!defined(_LIBCPP_VERSION) || _LIBCPP_AVAILABILITY_HAS_PMR' is not met!" +# endif +# endif + +# ifndef __cpp_lib_modules +# error "__cpp_lib_modules should be defined in c++26" +# endif +# if __cpp_lib_modules != 202207L +# error "__cpp_lib_modules should have the value 202207L in c++26" +# endif + +# ifndef __cpp_lib_move_iterator_concept +# error "__cpp_lib_move_iterator_concept should be defined in c++26" +# endif +# if __cpp_lib_move_iterator_concept != 202207L +# error "__cpp_lib_move_iterator_concept should have the value 202207L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_move_only_function +# error "__cpp_lib_move_only_function should be defined in c++26" +# endif +# if __cpp_lib_move_only_function != 202110L +# error "__cpp_lib_move_only_function should have the value 202110L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_move_only_function +# error "__cpp_lib_move_only_function should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# ifndef __cpp_lib_node_extract +# error "__cpp_lib_node_extract should be defined in c++26" +# endif +# if __cpp_lib_node_extract != 201606L +# error "__cpp_lib_node_extract should have the value 201606L in c++26" +# endif + +# ifndef __cpp_lib_nonmember_container_access +# error "__cpp_lib_nonmember_container_access should be defined in c++26" +# endif +# if __cpp_lib_nonmember_container_access != 201411L +# error "__cpp_lib_nonmember_container_access should have the value 201411L in c++26" +# endif + +# ifndef __cpp_lib_not_fn +# error "__cpp_lib_not_fn should be defined in c++26" +# endif +# if __cpp_lib_not_fn != 202306L +# error "__cpp_lib_not_fn should have the value 202306L in c++26" +# endif + +# ifndef __cpp_lib_null_iterators +# error "__cpp_lib_null_iterators should be defined in c++26" +# endif +# if __cpp_lib_null_iterators != 201304L +# error "__cpp_lib_null_iterators should have the value 201304L in c++26" +# endif + +# ifndef __cpp_lib_optional +# error "__cpp_lib_optional should be defined in c++26" +# endif +# if __cpp_lib_optional != 202110L +# error "__cpp_lib_optional should have the value 202110L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_optional_range_support +# error "__cpp_lib_optional_range_support should be defined in c++26" +# endif +# if __cpp_lib_optional_range_support != 202406L +# error "__cpp_lib_optional_range_support should have the value 202406L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_optional_range_support +# error "__cpp_lib_optional_range_support should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# ifndef __cpp_lib_out_ptr +# error "__cpp_lib_out_ptr should be defined in c++26" +# endif +# if __cpp_lib_out_ptr != 202311L +# error "__cpp_lib_out_ptr should have the value 202311L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_parallel_algorithm +# error "__cpp_lib_parallel_algorithm should be defined in c++26" +# endif +# if __cpp_lib_parallel_algorithm != 201603L +# error "__cpp_lib_parallel_algorithm should have the value 201603L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_parallel_algorithm +# error "__cpp_lib_parallel_algorithm should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_philox_engine +# error "__cpp_lib_philox_engine should be defined in c++26" +# endif +# if __cpp_lib_philox_engine != 202406L +# error "__cpp_lib_philox_engine should have the value 202406L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_philox_engine +# error "__cpp_lib_philox_engine should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# if !defined(_LIBCPP_VERSION) || _LIBCPP_AVAILABILITY_HAS_PMR +# ifndef __cpp_lib_polymorphic_allocator +# error "__cpp_lib_polymorphic_allocator should be defined in c++26" +# endif +# if __cpp_lib_polymorphic_allocator != 201902L +# error "__cpp_lib_polymorphic_allocator should have the value 201902L in c++26" +# endif +# else +# ifdef __cpp_lib_polymorphic_allocator +# error "__cpp_lib_polymorphic_allocator should not be defined when the requirement '!defined(_LIBCPP_VERSION) || _LIBCPP_AVAILABILITY_HAS_PMR' is not met!" +# endif +# endif + +# if !defined(_LIBCPP_VERSION) || _LIBCPP_AVAILABILITY_HAS_TO_CHARS_FLOATING_POINT +# ifndef __cpp_lib_print +# error "__cpp_lib_print should be defined in c++26" +# endif +# if __cpp_lib_print != 202207L +# error "__cpp_lib_print should have the value 202207L in c++26" +# endif +# else +# ifdef __cpp_lib_print +# error "__cpp_lib_print should not be defined when the requirement '!defined(_LIBCPP_VERSION) || _LIBCPP_AVAILABILITY_HAS_TO_CHARS_FLOATING_POINT' is not met!" +# endif +# endif + +# if !defined(_LIBCPP_VERSION) || _LIBCPP_HAS_LOCALIZATION +# ifndef __cpp_lib_quoted_string_io +# error "__cpp_lib_quoted_string_io should be defined in c++26" +# endif +# if __cpp_lib_quoted_string_io != 201304L +# error "__cpp_lib_quoted_string_io should have the value 201304L in c++26" +# endif +# else +# ifdef __cpp_lib_quoted_string_io +# error "__cpp_lib_quoted_string_io should not be defined when the requirement '!defined(_LIBCPP_VERSION) || _LIBCPP_HAS_LOCALIZATION' is not met!" +# endif +# endif + +# ifndef __cpp_lib_ranges +# error "__cpp_lib_ranges should be defined in c++26" +# endif +# if __cpp_lib_ranges != 202406L +# error "__cpp_lib_ranges should have the value 202406L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_ranges_as_const +# error "__cpp_lib_ranges_as_const should be defined in c++26" +# endif +# if __cpp_lib_ranges_as_const != 202207L +# error "__cpp_lib_ranges_as_const should have the value 202207L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_ranges_as_const +# error "__cpp_lib_ranges_as_const should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# ifndef __cpp_lib_ranges_as_rvalue +# error "__cpp_lib_ranges_as_rvalue should be defined in c++26" +# endif +# if __cpp_lib_ranges_as_rvalue != 202207L +# error "__cpp_lib_ranges_as_rvalue should have the value 202207L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_ranges_chunk +# error "__cpp_lib_ranges_chunk should be defined in c++26" +# endif +# if __cpp_lib_ranges_chunk != 202202L +# error "__cpp_lib_ranges_chunk should have the value 202202L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_ranges_chunk +# error "__cpp_lib_ranges_chunk should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# ifndef __cpp_lib_ranges_chunk_by +# error "__cpp_lib_ranges_chunk_by should be defined in c++26" +# endif +# if __cpp_lib_ranges_chunk_by != 202202L +# error "__cpp_lib_ranges_chunk_by should have the value 202202L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_ranges_concat +# error "__cpp_lib_ranges_concat should be defined in c++26" +# endif +# if __cpp_lib_ranges_concat != 202403L +# error "__cpp_lib_ranges_concat should have the value 202403L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_ranges_concat +# error "__cpp_lib_ranges_concat should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# ifndef __cpp_lib_ranges_contains +# error "__cpp_lib_ranges_contains should be defined in c++26" +# endif +# if __cpp_lib_ranges_contains != 202207L +# error "__cpp_lib_ranges_contains should have the value 202207L in c++26" +# endif + +# ifndef __cpp_lib_ranges_find_last +# error "__cpp_lib_ranges_find_last should be defined in c++26" +# endif +# if __cpp_lib_ranges_find_last != 202207L +# error "__cpp_lib_ranges_find_last should have the value 202207L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_ranges_iota +# error "__cpp_lib_ranges_iota should be defined in c++26" +# endif +# if __cpp_lib_ranges_iota != 202202L +# error "__cpp_lib_ranges_iota should have the value 202202L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_ranges_iota +# error "__cpp_lib_ranges_iota should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_ranges_join_with +# error "__cpp_lib_ranges_join_with should be defined in c++26" +# endif +# if __cpp_lib_ranges_join_with != 202202L +# error "__cpp_lib_ranges_join_with should have the value 202202L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_ranges_join_with +# error "__cpp_lib_ranges_join_with should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# ifndef __cpp_lib_ranges_repeat +# error "__cpp_lib_ranges_repeat should be defined in c++26" +# endif +# if __cpp_lib_ranges_repeat != 202207L +# error "__cpp_lib_ranges_repeat should have the value 202207L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_ranges_slide +# error "__cpp_lib_ranges_slide should be defined in c++26" +# endif +# if __cpp_lib_ranges_slide != 202202L +# error "__cpp_lib_ranges_slide should have the value 202202L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_ranges_slide +# error "__cpp_lib_ranges_slide should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# ifndef __cpp_lib_ranges_starts_ends_with +# error "__cpp_lib_ranges_starts_ends_with should be defined in c++26" +# endif +# if __cpp_lib_ranges_starts_ends_with != 202106L +# error "__cpp_lib_ranges_starts_ends_with should have the value 202106L in c++26" +# endif + +# ifndef __cpp_lib_ranges_to_container +# error "__cpp_lib_ranges_to_container should be defined in c++26" +# endif +# if __cpp_lib_ranges_to_container != 202202L +# error "__cpp_lib_ranges_to_container should have the value 202202L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_ranges_zip +# error "__cpp_lib_ranges_zip should be defined in c++26" +# endif +# if __cpp_lib_ranges_zip != 202110L +# error "__cpp_lib_ranges_zip should have the value 202110L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_ranges_zip +# error "__cpp_lib_ranges_zip should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# ifndef __cpp_lib_ratio +# error "__cpp_lib_ratio should be defined in c++26" +# endif +# if __cpp_lib_ratio != 202306L +# error "__cpp_lib_ratio should have the value 202306L in c++26" +# endif + +# ifndef __cpp_lib_raw_memory_algorithms +# error "__cpp_lib_raw_memory_algorithms should be defined in c++26" +# endif +# if __cpp_lib_raw_memory_algorithms != 201606L +# error "__cpp_lib_raw_memory_algorithms should have the value 201606L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_rcu +# error "__cpp_lib_rcu should be defined in c++26" +# endif +# if __cpp_lib_rcu != 202306L +# error "__cpp_lib_rcu should have the value 202306L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_rcu +# error "__cpp_lib_rcu should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_reference_from_temporary +# error "__cpp_lib_reference_from_temporary should be defined in c++26" +# endif +# if __cpp_lib_reference_from_temporary != 202202L +# error "__cpp_lib_reference_from_temporary should have the value 202202L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_reference_from_temporary +# error "__cpp_lib_reference_from_temporary should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# ifndef __cpp_lib_reference_wrapper +# error "__cpp_lib_reference_wrapper should be defined in c++26" +# endif +# if __cpp_lib_reference_wrapper != 202403L +# error "__cpp_lib_reference_wrapper should have the value 202403L in c++26" +# endif + +# ifndef __cpp_lib_remove_cvref +# error "__cpp_lib_remove_cvref should be defined in c++26" +# endif +# if __cpp_lib_remove_cvref != 201711L +# error "__cpp_lib_remove_cvref should have the value 201711L in c++26" +# endif + +# ifndef __cpp_lib_result_of_sfinae +# error "__cpp_lib_result_of_sfinae should be defined in c++26" +# endif +# if __cpp_lib_result_of_sfinae != 201210L +# error "__cpp_lib_result_of_sfinae should have the value 201210L in c++26" +# endif + +# ifndef __cpp_lib_robust_nonmodifying_seq_ops +# error "__cpp_lib_robust_nonmodifying_seq_ops should be defined in c++26" +# endif +# if __cpp_lib_robust_nonmodifying_seq_ops != 201304L +# error "__cpp_lib_robust_nonmodifying_seq_ops should have the value 201304L in c++26" +# endif + +# ifndef __cpp_lib_sample +# error "__cpp_lib_sample should be defined in c++26" +# endif +# if __cpp_lib_sample != 201603L +# error "__cpp_lib_sample should have the value 201603L in c++26" +# endif + +# ifndef __cpp_lib_saturation_arithmetic +# error "__cpp_lib_saturation_arithmetic should be defined in c++26" +# endif +# if __cpp_lib_saturation_arithmetic != 202311L +# error "__cpp_lib_saturation_arithmetic should have the value 202311L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) || _LIBCPP_HAS_THREADS +# ifndef __cpp_lib_scoped_lock +# error "__cpp_lib_scoped_lock should be defined in c++26" +# endif +# if __cpp_lib_scoped_lock != 201703L +# error "__cpp_lib_scoped_lock should have the value 201703L in c++26" +# endif +# else +# ifdef __cpp_lib_scoped_lock +# error "__cpp_lib_scoped_lock should not be defined when the requirement '!defined(_LIBCPP_VERSION) || _LIBCPP_HAS_THREADS' is not met!" +# endif +# endif + +# if !defined(_LIBCPP_VERSION) || (_LIBCPP_HAS_THREADS && _LIBCPP_AVAILABILITY_HAS_SYNC) +# ifndef __cpp_lib_semaphore +# error "__cpp_lib_semaphore should be defined in c++26" +# endif +# if __cpp_lib_semaphore != 201907L +# error "__cpp_lib_semaphore should have the value 201907L in c++26" +# endif +# else +# ifdef __cpp_lib_semaphore +# error "__cpp_lib_semaphore should not be defined when the requirement '!defined(_LIBCPP_VERSION) || (_LIBCPP_HAS_THREADS && _LIBCPP_AVAILABILITY_HAS_SYNC)' is not met!" +# endif +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_senders +# error "__cpp_lib_senders should be defined in c++26" +# endif +# if __cpp_lib_senders != 202406L +# error "__cpp_lib_senders should have the value 202406L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_senders +# error "__cpp_lib_senders should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# if _LIBCPP_HAS_THREADS +# ifndef __cpp_lib_shared_mutex +# error "__cpp_lib_shared_mutex should be defined in c++26" +# endif +# if __cpp_lib_shared_mutex != 201505L +# error "__cpp_lib_shared_mutex should have the value 201505L in c++26" +# endif +# else +# ifdef __cpp_lib_shared_mutex +# error "__cpp_lib_shared_mutex should not be defined when the requirement '_LIBCPP_HAS_THREADS' is not met!" +# endif +# endif + +# ifndef __cpp_lib_shared_ptr_arrays +# error "__cpp_lib_shared_ptr_arrays should be defined in c++26" +# endif +# if __cpp_lib_shared_ptr_arrays != 201707L +# error "__cpp_lib_shared_ptr_arrays should have the value 201707L in c++26" +# endif + +# ifndef __cpp_lib_shared_ptr_weak_type +# error "__cpp_lib_shared_ptr_weak_type should be defined in c++26" +# endif +# if __cpp_lib_shared_ptr_weak_type != 201606L +# error "__cpp_lib_shared_ptr_weak_type should have the value 201606L in c++26" +# endif + +# if _LIBCPP_HAS_THREADS +# ifndef __cpp_lib_shared_timed_mutex +# error "__cpp_lib_shared_timed_mutex should be defined in c++26" +# endif +# if __cpp_lib_shared_timed_mutex != 201402L +# error "__cpp_lib_shared_timed_mutex should have the value 201402L in c++26" +# endif +# else +# ifdef __cpp_lib_shared_timed_mutex +# error "__cpp_lib_shared_timed_mutex should not be defined when the requirement '_LIBCPP_HAS_THREADS' is not met!" +# endif +# endif + +# ifndef __cpp_lib_shift +# error "__cpp_lib_shift should be defined in c++26" +# endif +# if __cpp_lib_shift != 201806L +# error "__cpp_lib_shift should have the value 201806L in c++26" +# endif + +# ifndef __cpp_lib_smart_ptr_for_overwrite +# error "__cpp_lib_smart_ptr_for_overwrite should be defined in c++26" +# endif +# if __cpp_lib_smart_ptr_for_overwrite != 202002L +# error "__cpp_lib_smart_ptr_for_overwrite should have the value 202002L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_smart_ptr_owner_equality +# error "__cpp_lib_smart_ptr_owner_equality should be defined in c++26" +# endif +# if __cpp_lib_smart_ptr_owner_equality != 202306L +# error "__cpp_lib_smart_ptr_owner_equality should have the value 202306L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_smart_ptr_owner_equality +# error "__cpp_lib_smart_ptr_owner_equality should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# ifndef __cpp_lib_source_location +# error "__cpp_lib_source_location should be defined in c++26" +# endif +# if __cpp_lib_source_location != 201907L +# error "__cpp_lib_source_location should have the value 201907L in c++26" +# endif + +# ifndef __cpp_lib_span +# error "__cpp_lib_span should be defined in c++26" +# endif +# if __cpp_lib_span != 202002L +# error "__cpp_lib_span should have the value 202002L in c++26" +# endif + +# ifndef __cpp_lib_span_at +# error "__cpp_lib_span_at should be defined in c++26" +# endif +# if __cpp_lib_span_at != 202311L +# error "__cpp_lib_span_at should have the value 202311L in c++26" +# endif + +# ifndef __cpp_lib_span_initializer_list +# error "__cpp_lib_span_initializer_list should be defined in c++26" +# endif +# if __cpp_lib_span_initializer_list != 202311L +# error "__cpp_lib_span_initializer_list should have the value 202311L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_spanstream +# error "__cpp_lib_spanstream should be defined in c++26" +# endif +# if __cpp_lib_spanstream != 202106L +# error "__cpp_lib_spanstream should have the value 202106L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_spanstream +# error "__cpp_lib_spanstream should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# ifndef __cpp_lib_ssize +# error "__cpp_lib_ssize should be defined in c++26" +# endif +# if __cpp_lib_ssize != 201902L +# error "__cpp_lib_ssize should have the value 201902L in c++26" +# endif + +# ifndef __cpp_lib_sstream_from_string_view +# error "__cpp_lib_sstream_from_string_view should be defined in c++26" +# endif +# if __cpp_lib_sstream_from_string_view != 202306L +# error "__cpp_lib_sstream_from_string_view should have the value 202306L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_stacktrace +# error "__cpp_lib_stacktrace should be defined in c++26" +# endif +# if __cpp_lib_stacktrace != 202011L +# error "__cpp_lib_stacktrace should have the value 202011L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_stacktrace +# error "__cpp_lib_stacktrace should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# ifndef __cpp_lib_starts_ends_with +# error "__cpp_lib_starts_ends_with should be defined in c++26" +# endif +# if __cpp_lib_starts_ends_with != 201711L +# error "__cpp_lib_starts_ends_with should have the value 201711L in c++26" +# endif + +# ifndef __cpp_lib_stdatomic_h +# error "__cpp_lib_stdatomic_h should be defined in c++26" +# endif +# if __cpp_lib_stdatomic_h != 202011L +# error "__cpp_lib_stdatomic_h should have the value 202011L in c++26" +# endif + +# ifndef __cpp_lib_string_contains +# error "__cpp_lib_string_contains should be defined in c++26" +# endif +# if __cpp_lib_string_contains != 202011L +# error "__cpp_lib_string_contains should have the value 202011L in c++26" +# endif + +# ifndef __cpp_lib_string_resize_and_overwrite +# error "__cpp_lib_string_resize_and_overwrite should be defined in c++26" +# endif +# if __cpp_lib_string_resize_and_overwrite != 202110L +# error "__cpp_lib_string_resize_and_overwrite should have the value 202110L in c++26" +# endif + +# ifndef __cpp_lib_string_udls +# error "__cpp_lib_string_udls should be defined in c++26" +# endif +# if __cpp_lib_string_udls != 201304L +# error "__cpp_lib_string_udls should have the value 201304L in c++26" +# endif + +# ifndef __cpp_lib_string_view +# error "__cpp_lib_string_view should be defined in c++26" +# endif +# if __cpp_lib_string_view != 202403L +# error "__cpp_lib_string_view should have the value 202403L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_submdspan +# error "__cpp_lib_submdspan should be defined in c++26" +# endif +# if __cpp_lib_submdspan != 202306L +# error "__cpp_lib_submdspan should have the value 202306L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_submdspan +# error "__cpp_lib_submdspan should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# if !defined(_LIBCPP_VERSION) || _LIBCPP_HAS_EXPERIMENTAL_SYNCSTREAM +# ifndef __cpp_lib_syncbuf +# error "__cpp_lib_syncbuf should be defined in c++26" +# endif +# if __cpp_lib_syncbuf != 201803L +# error "__cpp_lib_syncbuf should have the value 201803L in c++26" +# endif +# else +# ifdef __cpp_lib_syncbuf +# error "__cpp_lib_syncbuf should not be defined when the requirement '!defined(_LIBCPP_VERSION) || _LIBCPP_HAS_EXPERIMENTAL_SYNCSTREAM' is not met!" +# endif +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_text_encoding +# error "__cpp_lib_text_encoding should be defined in c++26" +# endif +# if __cpp_lib_text_encoding != 202306L +# error "__cpp_lib_text_encoding should have the value 202306L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_text_encoding +# error "__cpp_lib_text_encoding should not be defined because it is unimplemented in libc++!" +# endif +# 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 != 201907L +# error "__cpp_lib_three_way_comparison should have the value 201907L in c++26" +# endif + +# ifndef __cpp_lib_to_address +# error "__cpp_lib_to_address should be defined in c++26" +# endif +# if __cpp_lib_to_address != 201711L +# error "__cpp_lib_to_address should have the value 201711L in c++26" +# endif + +# ifndef __cpp_lib_to_array +# error "__cpp_lib_to_array should be defined in c++26" +# endif +# if __cpp_lib_to_array != 201907L +# error "__cpp_lib_to_array should have the value 201907L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_to_chars +# error "__cpp_lib_to_chars should be defined in c++26" +# endif +# if __cpp_lib_to_chars != 202306L +# error "__cpp_lib_to_chars should have the value 202306L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_to_chars +# error "__cpp_lib_to_chars should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# ifndef __cpp_lib_to_string +# error "__cpp_lib_to_string should be defined in c++26" +# endif +# if __cpp_lib_to_string != 202306L +# error "__cpp_lib_to_string should have the value 202306L in c++26" +# endif + +# ifndef __cpp_lib_to_underlying +# error "__cpp_lib_to_underlying should be defined in c++26" +# endif +# if __cpp_lib_to_underlying != 202102L +# error "__cpp_lib_to_underlying should have the value 202102L in c++26" +# endif + +# ifndef __cpp_lib_transformation_trait_aliases +# error "__cpp_lib_transformation_trait_aliases should be defined in c++26" +# endif +# if __cpp_lib_transformation_trait_aliases != 201304L +# error "__cpp_lib_transformation_trait_aliases should have the value 201304L in c++26" +# endif + +# ifndef __cpp_lib_transparent_operators +# error "__cpp_lib_transparent_operators should be defined in c++26" +# endif +# if __cpp_lib_transparent_operators != 201510L +# error "__cpp_lib_transparent_operators should have the value 201510L in c++26" +# endif + +# ifndef __cpp_lib_tuple_element_t +# error "__cpp_lib_tuple_element_t should be defined in c++26" +# endif +# if __cpp_lib_tuple_element_t != 201402L +# error "__cpp_lib_tuple_element_t should have the value 201402L in c++26" +# endif + +# if !defined(_LIBCPP_VERSION) +# ifndef __cpp_lib_tuple_like +# error "__cpp_lib_tuple_like should be defined in c++26" +# endif +# if __cpp_lib_tuple_like != 202311L +# error "__cpp_lib_tuple_like should have the value 202311L in c++26" +# endif +# else // _LIBCPP_VERSION +# ifdef __cpp_lib_tuple_like +# error "__cpp_lib_tuple_like should not be defined because it is unimplemented in libc++!" +# endif +# endif + +# ifndef __cpp_lib_tuples_by_type +# error "__cpp_lib_tuples_by_type should be defined in c++26" +# endif +# if __cpp_lib_tuples_by_type != 201304L +# error "__cpp_lib_tuples_by_type should have the value 201304L in c++26" +# endif + +# ifndef __cpp_lib_type_identity +# error "__cpp_lib_type_identity should be defined in c++26" +# endif +# if __cpp_lib_type_identity != 201806L +# error "__cpp_lib_type_identity should have the value 201806L in c++26" +# endif + +# ifndef __cpp_lib_type_trait_variable_templates +# error "__cpp_lib_type_trait_variable_templates should be defined in c++26" +# endif +# if __cpp_lib_type_trait_variable_templates != 201510L +# error "__cpp_lib_type_trait_variable_templates should have the value 201510L in c++26" +# endif + +# ifndef __cpp_lib_uncaught_exceptions +# error "__cpp_lib_uncaught_exceptions should be defined in c++26" +# endif +# if __cpp_lib_uncaught_exceptions != 201411L +# error "__cpp_lib_uncaught_exceptions should have the value 201411L in c++26" +# endif + +# ifndef __cpp_lib_unordered_map_try_emplace +# error "__cpp_lib_unordered_map_try_emplace should be defined in c++26" +# endif +# if __cpp_lib_unordered_map_try_emplace != 201411L +# error "__cpp_lib_unordered_map_try_emplace should have the value 201411L in c++26" +# endif + +# ifndef __cpp_lib_unreachable +# error "__cpp_lib_unreachable should be defined in c++26" +# endif +# if __cpp_lib_unreachable != 202202L +# error "__cpp_lib_unreachable should have the value 202202L in c++26" +# endif + +# ifndef __cpp_lib_unwrap_ref +# error "__cpp_lib_unwrap_ref should be defined in c++26" +# endif +# if __cpp_lib_unwrap_ref != 201811L +# error "__cpp_lib_unwrap_ref should have the value 201811L in c++26" +# endif + +# ifndef __cpp_lib_variant +# error "__cpp_lib_variant should be defined in c++26" +# endif +# if __cpp_lib_variant != 202306L +# error "__cpp_lib_variant should have the value 202306L in c++26" +# endif + +# ifndef __cpp_lib_void_t +# error "__cpp_lib_void_t should be defined in c++26" +# endif +# if __cpp_lib_void_t != 201411L +# error "__cpp_lib_void_t should have the value 201411L in c++26" +# endif +======= # ifndef __cpp_lib_adaptor_iterator_pair_constructor # error "__cpp_lib_adaptor_iterator_pair_constructor should be defined in c++26" # endif @@ -8138,6 +10096,7 @@ # if __cpp_lib_void_t != 201411L # error "__cpp_lib_void_t should have the value 201411L in c++26" # endif +>>>>>>> main #endif // TEST_STD_VER > 23 diff --git a/libcxx/test/std/strings/string.conversions/to_string.pass.cpp b/libcxx/test/std/strings/string.conversions/to_string.pass.cpp index 4731a072e8910..6bbcba8fe1a0d 100644 --- a/libcxx/test/std/strings/string.conversions/to_string.pass.cpp +++ b/libcxx/test/std/strings/string.conversions/to_string.pass.cpp @@ -18,8 +18,10 @@ // string to_string(double val); // string to_string(long double val); -#include #include +#include +#include +#include #include #include "parse_integer.h" @@ -32,29 +34,44 @@ void test_signed() { assert(s.size() == 1); assert(s[s.size()] == 0); assert(s == "0"); +#if TEST_STD_VER >= 26 + assert(s == std::format("{}", T(0))); +#endif } { std::string s = std::to_string(T(12345)); assert(s.size() == 5); assert(s[s.size()] == 0); assert(s == "12345"); +#if TEST_STD_VER >= 26 + assert(s == std::format("{}", T(12345))); +#endif } { std::string s = std::to_string(T(-12345)); assert(s.size() == 6); assert(s[s.size()] == 0); assert(s == "-12345"); +#if TEST_STD_VER >= 26 + assert(s == std::format("{}", T(-12345))); +#endif } { std::string s = std::to_string(std::numeric_limits::max()); assert(s.size() == std::numeric_limits::digits10 + 1); T t = parse_integer(s); assert(t == std::numeric_limits::max()); +#if TEST_STD_VER >= 26 + assert(s == std::format("{}", std::numeric_limits::max())); +#endif } { std::string s = std::to_string(std::numeric_limits::min()); T t = parse_integer(s); assert(t == std::numeric_limits::min()); +#if TEST_STD_VER >= 26 + assert(s == std::format("{}", std::numeric_limits::min())); +#endif } } @@ -65,18 +82,27 @@ void test_unsigned() { assert(s.size() == 1); assert(s[s.size()] == 0); assert(s == "0"); +#if TEST_STD_VER >= 26 + assert(s == std::format("{}", T(0))); +#endif } { std::string s = std::to_string(T(12345)); assert(s.size() == 5); assert(s[s.size()] == 0); assert(s == "12345"); +#if TEST_STD_VER >= 26 + assert(s == std::format("{}", T(12345))); +#endif } { std::string s = std::to_string(std::numeric_limits::max()); assert(s.size() == std::numeric_limits::digits10 + 1); T t = parse_integer(s); assert(t == std::numeric_limits::max()); +#if TEST_STD_VER >= 26 + assert(s == std::format("{}", std::numeric_limits::max())); +#endif } } @@ -84,24 +110,125 @@ template void test_float() { { std::string s = std::to_string(T(0)); +#if TEST_STD_VER < 26 assert(s.size() == 8); assert(s[s.size()] == 0); assert(s == "0.000000"); +#else + std::string f = std::format("{}", T(0)); + assert(s == f); + assert(s == "0"); +#endif } { std::string s = std::to_string(T(12345)); +#if TEST_STD_VER < 26 assert(s.size() == 12); assert(s[s.size()] == 0); assert(s == "12345.000000"); +#else + std::string f = std::format("{}", T(12345)); + assert(s == f); + assert(s == "12345"); +#endif } { std::string s = std::to_string(T(-12345)); +#if TEST_STD_VER < 26 assert(s.size() == 13); assert(s[s.size()] == 0); assert(s == "-12345.000000"); +#else + std::string f = std::format("{}", T(-12345)); + assert(s == f); + assert(s == "-12345"); +#endif + } + +#if TEST_STD_VER >= 26 + { + std::string s = std::to_string(T(90.84)); + std::string f = std::format("{}", T(90.84)); + assert(s == f); + assert(s == "90.84"); } + { + std::string s = std::to_string(T(-90.84)); + std::string f = std::format("{}", T(-90.84)); + assert(s == f); + assert(s == "-90.84"); + } +#endif +} + +#if TEST_STD_VER >= 26 + +template +void test_float_with_locale(const char* locale, T inputValue, const char* expectedValue) { + setlocale(LC_ALL, locale); + + std::string s = std::to_string(inputValue); + std::string f = std::format("{}", inputValue); + assert(s == f); + assert(s == expectedValue); } +void test_float_with_locale() { + // Locale "C" + + test_float_with_locale("C", 0.9084, "0.9084"); + test_float_with_locale("C", 0.9084, "0.9084"); + test_float_with_locale("C", 0.9084, "0.9084"); + + test_float_with_locale("C", -0.9084, "-0.9084"); + test_float_with_locale("C", -0.9084, "-0.9084"); + test_float_with_locale("C", -0.9084, "-0.9084"); + + test_float_with_locale("C", 1e-7, "1e-07"); + test_float_with_locale("C", 1e-7, "1e-07"); + test_float_with_locale("C", 1e-7, "1e-07"); + + test_float_with_locale("C", -1e-7, "-1e-07"); + test_float_with_locale("C", -1e-7, "-1e-07"); + test_float_with_locale("C", -1e-7, "-1e-07"); + + test_float_with_locale("C", 1.7976931348623157e+308, "inf"); + test_float_with_locale("C", 1.7976931348623157e+308, "1.7976931348623157e+308"); + test_float_with_locale("C", 1.7976931348623157e+308, "1.7976931348623157e+308"); + + test_float_with_locale("C", -1.7976931348623157e+308, "-inf"); + test_float_with_locale("C", -1.7976931348623157e+308, "-1.7976931348623157e+308"); + test_float_with_locale("C", -1.7976931348623157e+308, "-1.7976931348623157e+308"); + + // Locale "uk_UA.UTF-8" + + test_float_with_locale("uk_UA.UTF-8", 0.9084, "0.9084"); + test_float_with_locale("uk_UA.UTF-8", 0.9084, "0.9084"); + test_float_with_locale("uk_UA.UTF-8", 0.9084, "0.9084"); + + test_float_with_locale("uk_UA.UTF-8", -0.9084, "-0.9084"); + test_float_with_locale("uk_UA.UTF-8", -0.9084, "-0.9084"); + test_float_with_locale("uk_UA.UTF-8", -0.9084, "-0.9084"); + + test_float_with_locale("uk_UA.UTF-8", 1e-7, "1e-07"); + test_float_with_locale("uk_UA.UTF-8", 1e-7, "1e-07"); + test_float_with_locale("uk_UA.UTF-8", 1e-7, "1e-07"); + + test_float_with_locale("uk_UA.UTF-8", -1e-7, "-1e-07"); + test_float_with_locale("uk_UA.UTF-8", -1e-7, "-1e-07"); + test_float_with_locale("uk_UA.UTF-8", -1e-7, "-1e-07"); + + test_float_with_locale("uk_UA.UTF-8", 1.7976931348623157e+308, "inf"); + test_float_with_locale("uk_UA.UTF-8", 1.7976931348623157e+308, "1.7976931348623157e+308"); + test_float_with_locale("uk_UA.UTF-8", 1.7976931348623157e+308, "1.7976931348623157e+308"); + + test_float_with_locale("uk_UA.UTF-8", -1.7976931348623157e+308, "-inf"); + test_float_with_locale("uk_UA.UTF-8", -1.7976931348623157e+308, "-1.7976931348623157e+308"); + test_float_with_locale("uk_UA.UTF-8", -1.7976931348623157e+308, "-1.7976931348623157e+308"); +} + +#endif + int main(int, char**) { test_signed(); test_signed(); @@ -112,6 +239,9 @@ int main(int, char**) { test_float(); test_float(); test_float(); +#if TEST_STD_VER >= 26 + test_float_with_locale(); +#endif return 0; } diff --git a/libcxx/test/std/strings/string.conversions/to_wstring.pass.cpp b/libcxx/test/std/strings/string.conversions/to_wstring.pass.cpp index fff5ede848b57..8473bf83c79a6 100644 --- a/libcxx/test/std/strings/string.conversions/to_wstring.pass.cpp +++ b/libcxx/test/std/strings/string.conversions/to_wstring.pass.cpp @@ -20,8 +20,10 @@ // wstring to_wstring(double val); // wstring to_wstring(long double val); -#include #include +#include +#include +#include #include #include "parse_integer.h" @@ -34,29 +36,44 @@ void test_signed() { assert(s.size() == 1); assert(s[s.size()] == 0); assert(s == L"0"); +#if TEST_STD_VER >= 26 + assert(s == std::format(L"{}", T(0))); +#endif } { std::wstring s = std::to_wstring(T(12345)); assert(s.size() == 5); assert(s[s.size()] == 0); assert(s == L"12345"); +#if TEST_STD_VER >= 26 + assert(s == std::format(L"{}", T(12345))); +#endif } { std::wstring s = std::to_wstring(T(-12345)); assert(s.size() == 6); assert(s[s.size()] == 0); assert(s == L"-12345"); +#if TEST_STD_VER >= 26 + assert(s == std::format(L"{}", T(-12345))); +#endif } { std::wstring s = std::to_wstring(std::numeric_limits::max()); assert(s.size() == std::numeric_limits::digits10 + 1); T t = parse_integer(s); assert(t == std::numeric_limits::max()); +#if TEST_STD_VER >= 26 + assert(s == std::format(L"{}", T(std::numeric_limits::max()))); +#endif } { std::wstring s = std::to_wstring(std::numeric_limits::min()); T t = parse_integer(s); assert(t == std::numeric_limits::min()); +#if TEST_STD_VER >= 26 + assert(s == std::format(L"{}", T(std::numeric_limits::min()))); +#endif } } @@ -67,18 +84,27 @@ void test_unsigned() { assert(s.size() == 1); assert(s[s.size()] == 0); assert(s == L"0"); +#if TEST_STD_VER >= 26 + assert(s == std::format(L"{}", T(0))); +#endif } { std::wstring s = std::to_wstring(T(12345)); assert(s.size() == 5); assert(s[s.size()] == 0); assert(s == L"12345"); +#if TEST_STD_VER >= 26 + assert(s == std::format(L"{}", T(12345))); +#endif } { std::wstring s = std::to_wstring(std::numeric_limits::max()); assert(s.size() == std::numeric_limits::digits10 + 1); T t = parse_integer(s); assert(t == std::numeric_limits::max()); +#if TEST_STD_VER >= 26 + assert(s == std::format(L"{}", T(std::numeric_limits::max()))); +#endif } } @@ -86,24 +112,125 @@ template void test_float() { { std::wstring s = std::to_wstring(T(0)); +#if TEST_STD_VER < 26 assert(s.size() == 8); assert(s[s.size()] == 0); assert(s == L"0.000000"); +#else + std::wstring f = std::format(L"{}", T(0)); + assert(s == f); + assert(s == L"0"); +#endif } { std::wstring s = std::to_wstring(T(12345)); +#if TEST_STD_VER < 26 assert(s.size() == 12); assert(s[s.size()] == 0); assert(s == L"12345.000000"); +#else + std::wstring f = std::format(L"{}", T(12345)); + assert(s == f); + assert(s == L"12345"); +#endif } { std::wstring s = std::to_wstring(T(-12345)); +#if TEST_STD_VER < 26 assert(s.size() == 13); assert(s[s.size()] == 0); assert(s == L"-12345.000000"); +#else + std::wstring f = std::format(L"{}", T(-12345)); + assert(s == f); + assert(s == L"-12345"); +#endif + } + +#if TEST_STD_VER >= 26 + { + std::wstring s = std::to_wstring(T(90.84)); + std::wstring f = std::format(L"{}", T(90.84)); + assert(s == f); + assert(s == L"90.84"); } + { + std::wstring s = std::to_wstring(T(-90.84)); + std::wstring f = std::format(L"{}", T(-90.84)); + assert(s == f); + assert(s == L"-90.84"); + } +#endif +} + +#if TEST_STD_VER >= 26 + +template +void test_float_with_locale(const char* locale, T inputValue, const wchar_t* expectedValue) { + setlocale(LC_ALL, locale); + + std::wstring s = std::to_wstring(inputValue); + std::wstring f = std::format(L"{}", inputValue); + assert(s == f); + assert(s == expectedValue); } +void test_float_with_locale() { + // Locale "C" + + test_float_with_locale("C", 0.9084, L"0.9084"); + test_float_with_locale("C", 0.9084, L"0.9084"); + test_float_with_locale("C", 0.9084, L"0.9084"); + + test_float_with_locale("C", -0.9084, L"-0.9084"); + test_float_with_locale("C", -0.9084, L"-0.9084"); + test_float_with_locale("C", -0.9084, L"-0.9084"); + + test_float_with_locale("C", 1e-7, L"1e-07"); + test_float_with_locale("C", 1e-7, L"1e-07"); + test_float_with_locale("C", 1e-7, L"1e-07"); + + test_float_with_locale("C", -1e-7, L"-1e-07"); + test_float_with_locale("C", -1e-7, L"-1e-07"); + test_float_with_locale("C", -1e-7, L"-1e-07"); + + test_float_with_locale("C", 1.7976931348623157e+308, L"inf"); + test_float_with_locale("C", 1.7976931348623157e+308, L"1.7976931348623157e+308"); + test_float_with_locale("C", 1.7976931348623157e+308, L"1.7976931348623157e+308"); + + test_float_with_locale("C", -1.7976931348623157e+308, L"-inf"); + test_float_with_locale("C", -1.7976931348623157e+308, L"-1.7976931348623157e+308"); + test_float_with_locale("C", -1.7976931348623157e+308, L"-1.7976931348623157e+308"); + + // Locale "uk_UA.UTF-8" + + test_float_with_locale("uk_UA.UTF-8", 0.9084, L"0.9084"); + test_float_with_locale("uk_UA.UTF-8", 0.9084, L"0.9084"); + test_float_with_locale("uk_UA.UTF-8", 0.9084, L"0.9084"); + + test_float_with_locale("uk_UA.UTF-8", -0.9084, L"-0.9084"); + test_float_with_locale("uk_UA.UTF-8", -0.9084, L"-0.9084"); + test_float_with_locale("uk_UA.UTF-8", -0.9084, L"-0.9084"); + + test_float_with_locale("uk_UA.UTF-8", 1e-7, L"1e-07"); + test_float_with_locale("uk_UA.UTF-8", 1e-7, L"1e-07"); + test_float_with_locale("uk_UA.UTF-8", 1e-7, L"1e-07"); + + test_float_with_locale("uk_UA.UTF-8", -1e-7, L"-1e-07"); + test_float_with_locale("uk_UA.UTF-8", -1e-7, L"-1e-07"); + test_float_with_locale("uk_UA.UTF-8", -1e-7, L"-1e-07"); + + test_float_with_locale("uk_UA.UTF-8", 1.7976931348623157e+308, L"inf"); + test_float_with_locale("uk_UA.UTF-8", 1.7976931348623157e+308, L"1.7976931348623157e+308"); + test_float_with_locale("uk_UA.UTF-8", 1.7976931348623157e+308, L"1.7976931348623157e+308"); + + test_float_with_locale("uk_UA.UTF-8", -1.7976931348623157e+308, L"-inf"); + test_float_with_locale("uk_UA.UTF-8", -1.7976931348623157e+308, L"-1.7976931348623157e+308"); + test_float_with_locale("uk_UA.UTF-8", -1.7976931348623157e+308, L"-1.7976931348623157e+308"); +} + +#endif + int main(int, char**) { test_signed(); test_signed(); @@ -114,6 +241,9 @@ int main(int, char**) { test_float(); test_float(); test_float(); +#if TEST_STD_VER >= 26 + test_float_with_locale(); +#endif return 0; } diff --git a/libcxx/utils/generate_feature_test_macro_components.py b/libcxx/utils/generate_feature_test_macro_components.py index c1e579c775746..fee30eae3e934 100644 --- a/libcxx/utils/generate_feature_test_macro_components.py +++ b/libcxx/utils/generate_feature_test_macro_components.py @@ -1400,7 +1400,6 @@ def add_version_header(tc): "name": "__cpp_lib_to_string", "values": {"c++26": 202306}, # P2587R3 to_string or not to_string "headers": ["string"], - "unimplemented": True, }, { "name": "__cpp_lib_to_underlying",