Final polish and fixes.
diff --git a/libcxx/docs/FeatureTestMacroTable.rst b/libcxx/docs/FeatureTestMacroTable.rst
index dcf9838..952043f 100644
--- a/libcxx/docs/FeatureTestMacroTable.rst
+++ b/libcxx/docs/FeatureTestMacroTable.rst
@@ -358,7 +358,7 @@
---------------------------------------------------------- -----------------
``__cpp_lib_out_ptr`` ``202106L``
---------------------------------------------------------- -----------------
- ``__cpp_lib_print`` ``202207L``
+ ``__cpp_lib_print`` ``202403L``
---------------------------------------------------------- -----------------
``__cpp_lib_ranges`` ``202406L``
---------------------------------------------------------- -----------------
diff --git a/libcxx/docs/Status/Cxx2cPapers.csv b/libcxx/docs/Status/Cxx2cPapers.csv
index 1436db6..5ccb60e 100644
--- a/libcxx/docs/Status/Cxx2cPapers.csv
+++ b/libcxx/docs/Status/Cxx2cPapers.csv
@@ -50,7 +50,7 @@
"`P2867R2 <https://wg21.link/P2867R2>`__","Remove Deprecated ``strstreams`` From C++26","2024-03 (Tokyo)","|Complete|","19",""
"`P2869R4 <https://wg21.link/P2869R4>`__","Remove Deprecated ``shared_ptr`` Atomic Access APIs from C++26","2024-03 (Tokyo)","","",""
"`P2872R3 <https://wg21.link/P2872R3>`__","Remove ``wstring_convert`` From C++26","2024-03 (Tokyo)","|Complete|","19",""
-"`P3107R5 <https://wg21.link/P3107R5>`__","Permit an efficient implementation of ``std::print``","2024-03 (Tokyo)","","",""
+"`P3107R5 <https://wg21.link/P3107R5>`__","Permit an efficient implementation of ``std::print``","2024-03 (Tokyo)","|Complete|","21",""
"`P3142R0 <https://wg21.link/P3142R0>`__","Printing Blank Lines with ``println``","2024-03 (Tokyo)","|Complete|","19","Implemented as a DR against C++23. (MSVC STL and libstdc++ will do the same.)"
"`P2845R8 <https://wg21.link/P2845R8>`__","Formatting of ``std::filesystem::path``","2024-03 (Tokyo)","","",""
"`P0493R5 <https://wg21.link/P0493R5>`__","Atomic minimum/maximum","2024-03 (Tokyo)","","",""
diff --git a/libcxx/include/print b/libcxx/include/print
index 3372b08..8cc7c07 100644
--- a/libcxx/include/print
+++ b/libcxx/include/print
@@ -241,7 +241,7 @@
_LIBCPP_HIDE_FROM_ABI inline int __fflush_unlocked(FILE* __stream) {
# if defined(_LIBCPP_WIN32API)
return ::_fflush_nolock(__stream);
-# elif defined(__PICOLIBC__) || defined(_AIX) || defined(__ANDROID__)
+# elif defined(__PICOLIBC__) || defined(_AIX) || defined(__ANDROID__) || defined(__APPLE__)
// There is no fflush_unlocked on these systems.
// This funcion is not part of POSIX.
return ::fflush(__stream);
@@ -257,7 +257,7 @@
__fwrite_unlocked(const void* __buffer, [[maybe_unused]] size_t __size, size_t __n, FILE* __stream) {
# if defined(_LIBCPP_WIN32API)
return ::_fwrite_nolock(__buffer, __size, __n, __stream);
-# elif defined(__PICOLIBC__) || defined(_AIX) || defined(__ANDROID__)
+# elif defined(__PICOLIBC__) || defined(_AIX) || defined(__ANDROID__) || defined(__APPLE__)
// The function fwrite_unlocked is not part of POSIX and not available on
// these systems.
auto __b = static_cast<const char*>(__buffer);
@@ -291,7 +291,7 @@
return std::fflush(__stream);
else
# if defined(_LIBCPP_APPLE_CLANG_VER) && _LIBCPP_APPLE_CLANG_VER < 1600
- sizeof(__lock_policy) == 0
+ static_assert(sizeof(__lock_policy) == 0, "Unsupported policy");
# else
static_assert(false, "Unsupported policy");
# endif
@@ -316,7 +316,7 @@
__print::__flockfile(__stream_);
else if constexpr (__policy != __lock_policy::__stdio)
# if defined(_LIBCPP_APPLE_CLANG_VER) && _LIBCPP_APPLE_CLANG_VER < 1600
- sizeof(__lock_policy) == 0
+ static_assert(sizeof(__lock_policy) == 0, "Unsupported policy");
# else
static_assert(false, "Unsupported policy");
# endif
@@ -327,7 +327,7 @@
__print::__funlockfile(__stream_);
else if constexpr (__policy != __lock_policy::__stdio)
# if defined(_LIBCPP_APPLE_CLANG_VER) && _LIBCPP_APPLE_CLANG_VER < 1600
- sizeof(__lock_policy) == 0
+ static_assert(sizeof(__lock_policy) == 0, "Unsupported policy");
# else
static_assert(false, "Unsupported policy");
# endif
@@ -359,7 +359,7 @@
return std::fwrite(__small_buffer_, 1, __n, __stream_);
else
# if defined(_LIBCPP_APPLE_CLANG_VER) && _LIBCPP_APPLE_CLANG_VER < 1600
- sizeof(__lock_policy) == 0
+ static_assert(sizeof(__lock_policy) == 0, "Unsupported policy");
# else
static_assert(false, "Unsupported policy");
# endif
@@ -505,20 +505,19 @@
template <class... _Args>
_LIBCPP_HIDE_FROM_ABI void print(FILE* __stream, format_string<_Args...> __fmt, _Args&&... __args) {
-# if _LIBCPP_HAS_UNICODE
- constexpr bool __use_unicode = __print::__use_unicode_execution_charset;
-# else // _LIBCPP_HAS_UNICODE
- constexpr bool __use_unicode = false;
-# endif // _LIBCPP_HAS_UNICODE
constexpr bool __locksafe = (enable_nonlocking_formatter_optimization<remove_cvref_t<_Args>> && ...);
using enum __print::__lock_policy;
- if constexpr (__use_unicode)
+# if _LIBCPP_HAS_UNICODE
+ if constexpr (__print::__use_unicode_execution_charset)
__print::__vprint_unicode<__locksafe ? __manual : __stdio>(
__stream, __fmt.get(), std::make_format_args(__args...), false);
else
+# endif // _LIBCPP_HAS_UNICODE
+ {
__print::__vprint_nonunicode<__locksafe ? __manual : __stdio>(
__stream, __fmt.get(), std::make_format_args(__args...), false);
+ }
}
template <class... _Args>
@@ -528,23 +527,22 @@
template <class... _Args>
_LIBCPP_HIDE_FROM_ABI void println(FILE* __stream, format_string<_Args...> __fmt, _Args&&... __args) {
-# if _LIBCPP_HAS_UNICODE
- constexpr bool __use_unicode = __print::__use_unicode_execution_charset;
-# else // _LIBCPP_HAS_UNICODE
- constexpr bool __use_unicode = false;
-# endif // _LIBCPP_HAS_UNICODE
constexpr bool __locksafe = (enable_nonlocking_formatter_optimization<remove_cvref_t<_Args>> && ...);
// Note the wording in the Standard is inefficient. The output of
// std::format is a std::string which is then copied. This solution
// just appends a newline at the end of the output.
using enum __print::__lock_policy;
- if constexpr (__use_unicode)
+# if _LIBCPP_HAS_UNICODE
+ if constexpr (__print::__use_unicode_execution_charset)
__print::__vprint_unicode<__locksafe ? __manual : __stdio>(
__stream, __fmt.get(), std::make_format_args(__args...), true);
else
+# endif // _LIBCPP_HAS_UNICODE
+ {
__print::__vprint_nonunicode<__locksafe ? __manual : __stdio>(
__stream, __fmt.get(), std::make_format_args(__args...), true);
+ }
}
template <class = void> // TODO PRINT template or availability markup fires too eagerly (http://llvm.org/PR61563).
diff --git a/libcxx/include/version b/libcxx/include/version
index 63ead9f..f2f3352 100644
--- a/libcxx/include/version
+++ b/libcxx/include/version
@@ -185,7 +185,7 @@
__cpp_lib_parallel_algorithm 201603L <algorithm> <numeric>
__cpp_lib_philox_engine 202406L <random>
__cpp_lib_polymorphic_allocator 201902L <memory_resource>
-__cpp_lib_print 202207L <ostream> <print>
+__cpp_lib_print 202403L <ostream> <print>
__cpp_lib_quoted_string_io 201304L <iomanip>
__cpp_lib_ranges 202406L <algorithm> <functional> <iterator>
<memory> <ranges>
@@ -502,7 +502,7 @@
# define __cpp_lib_optional 202110L
# define __cpp_lib_out_ptr 202106L
# if _LIBCPP_AVAILABILITY_HAS_TO_CHARS_FLOATING_POINT
-# define __cpp_lib_print 202207L
+# define __cpp_lib_print 202403L
# endif
# undef __cpp_lib_ranges
# define __cpp_lib_ranges 202406L
diff --git a/libcxx/test/libcxx/system_reserved_names.gen.py b/libcxx/test/libcxx/system_reserved_names.gen.py
index 304c803..f011262 100644
--- a/libcxx/test/libcxx/system_reserved_names.gen.py
+++ b/libcxx/test/libcxx/system_reserved_names.gen.py
@@ -119,11 +119,6 @@
#define __acquire SYSTEM_RESERVED_NAME
#define __release SYSTEM_RESERVED_NAME
-// Android and FreeBSD use this for __attribute__((__unused__))
-#if !defined(__FreeBSD__) && !defined(__ANDROID__)
-#define __unused SYSTEM_RESERVED_NAME
-#endif
-
// These names are not reserved, so the user can macro-define them.
// These are intended to find improperly _Uglified template parameters.
#define A SYSTEM_RESERVED_NAME
diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/ostream.version.compile.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/ostream.version.compile.pass.cpp
index 61d7747..16bcb02 100644
--- a/libcxx/test/std/language.support/support.limits/support.limits.general/ostream.version.compile.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/support.limits.general/ostream.version.compile.pass.cpp
@@ -19,7 +19,7 @@
/* Constant Value
__cpp_lib_char8_t 201907L [C++20]
- __cpp_lib_print 202207L [C++23]
+ __cpp_lib_print 202403L [C++23]
*/
#include <ostream>
@@ -93,8 +93,8 @@
# ifndef __cpp_lib_print
# error "__cpp_lib_print should be defined in c++23"
# endif
-# if __cpp_lib_print != 202207L
-# error "__cpp_lib_print should have the value 202207L in c++23"
+# if __cpp_lib_print != 202403L
+# error "__cpp_lib_print should have the value 202403L in c++23"
# endif
# else
# ifdef __cpp_lib_print
@@ -121,8 +121,8 @@
# 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"
+# if __cpp_lib_print != 202403L
+# error "__cpp_lib_print should have the value 202403L in c++26"
# endif
# else
# ifdef __cpp_lib_print
diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/print.version.compile.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/print.version.compile.pass.cpp
index c9743cf..de04d0b 100644
--- a/libcxx/test/std/language.support/support.limits/support.limits.general/print.version.compile.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/support.limits.general/print.version.compile.pass.cpp
@@ -18,7 +18,7 @@
// Test the feature test macros defined by <print>
/* Constant Value
- __cpp_lib_print 202207L [C++23]
+ __cpp_lib_print 202403L [C++23]
*/
#include <print>
@@ -54,8 +54,8 @@
# ifndef __cpp_lib_print
# error "__cpp_lib_print should be defined in c++23"
# endif
-# if __cpp_lib_print != 202207L
-# error "__cpp_lib_print should have the value 202207L in c++23"
+# if __cpp_lib_print != 202403L
+# error "__cpp_lib_print should have the value 202403L in c++23"
# endif
# else
# ifdef __cpp_lib_print
@@ -69,8 +69,8 @@
# 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"
+# if __cpp_lib_print != 202403L
+# error "__cpp_lib_print should have the value 202403L in c++26"
# endif
# else
# ifdef __cpp_lib_print
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 1e4465d..6e2d3ee 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
@@ -169,7 +169,7 @@
__cpp_lib_parallel_algorithm 201603L [C++17]
__cpp_lib_philox_engine 202406L [C++26]
__cpp_lib_polymorphic_allocator 201902L [C++20]
- __cpp_lib_print 202207L [C++23]
+ __cpp_lib_print 202403L [C++23]
__cpp_lib_quoted_string_io 201304L [C++14]
__cpp_lib_ranges 202110L [C++20]
202406L [C++23]
@@ -5683,8 +5683,8 @@
# ifndef __cpp_lib_print
# error "__cpp_lib_print should be defined in c++23"
# endif
-# if __cpp_lib_print != 202207L
-# error "__cpp_lib_print should have the value 202207L in c++23"
+# if __cpp_lib_print != 202403L
+# error "__cpp_lib_print should have the value 202403L in c++23"
# endif
# else
# ifdef __cpp_lib_print
@@ -7567,8 +7567,8 @@
# 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"
+# if __cpp_lib_print != 202403L
+# error "__cpp_lib_print should have the value 202403L in c++26"
# endif
# else
# ifdef __cpp_lib_print
diff --git a/libcxx/utils/generate_feature_test_macro_components.py b/libcxx/utils/generate_feature_test_macro_components.py
index 8bf7633..7a0f31e 100755
--- a/libcxx/utils/generate_feature_test_macro_components.py
+++ b/libcxx/utils/generate_feature_test_macro_components.py
@@ -1010,8 +1010,7 @@
{
"name": "__cpp_lib_print",
"values": {
- "c++23": 202207,
- # "c++26": 202403, # P3107R5: Permit an efficient implementation of std::print
+ "c++23": 202403,
# "c++26": 202406, # P3235R3 std::print more types faster with less memory
},
"headers": ["ostream", "print"],