Libc++ 19.0.0 (In-Progress) Release Notes¶
Written by the Libc++ Team
Warning
These are in-progress notes for the upcoming libc++ 19.0.0 release. Release notes for previous releases can be found on the Download Page.
Introduction¶
This document contains the release notes for the libc++ C++ Standard Library, part of the LLVM Compiler Infrastructure, release 19.0.0. Here we describe the status of libc++ in some detail, including major improvements from the previous release and new feature work. For the general LLVM release notes, see the LLVM documentation. All LLVM releases may be downloaded from the LLVM releases web site.
For more information about libc++, please see the Libc++ Web Site or the LLVM Web Site.
Note that if you are reading this file from a Git checkout or the main Libc++ web page, this document applies to the next release, not the current one. To see the release notes for a specific release, please see the releases page.
What’s New in Libc++ 19.0.0?¶
The main focus of the libc++ team has been to implement new C++20, C++23, and C++26 features.
Experimental support for the time zone database has progressed.
Work on the ranges support has progressed. See libc++ Ranges Status for the current status.
Work on the experimental C++17 Parallel STL has progressed. See libc++ Parallel STL Status for the current status.
Work on the C++17 mathematical special functions has started. See libc++ Mathematical Special Functions Status (P0226R1) for the current status.
Implemented Papers¶
P1132R8 -
out_ptr
- a scalable output pointer abstractionP1614R2 - The Mothership has Landed
P2637R3 - Member
visit
P2652R2 - Disallow User Specialization of
allocator_traits
P2819R2 - Add
tuple
protocol tocomplex
P2495R3 - Interfacing
stringstream
s withstring_view
P2867R2 - Remove Deprecated
strstream
s From C++26P2872R3 - Remove
wstring_convert
From C++26P3142R0 - Printing Blank Lines with
println
(as DR against C++23)P2944R3 - Comparisons for
reference_wrapper
(comparison operators forreference_wrapper
only)P2591R5 - Concatenation of strings and string views
P2968R2 - Make
std::ignore
a first-class objectP2997R1 - Removing the common reference requirement from the indirectly invocable concepts (as DR against C++20)
P2302R4 -
std::ranges::contains
P1659R3 -
std::ranges::starts_with
andstd::ranges::ends_with
P3029R1 - Better
mdspan
’s CTADP2387R3 - Pipe support for user-defined range adaptors
P2713R1 - Escaping improvements in
std::format
P2231R1 - Missing
constexpr
instd::optional
andstd::variant
P0019R8 -
std::atomic_ref
P2389R2 - Alias template
dims
for theextents
ofmdspan
P1223R5 -
ranges::find_last()
,ranges::find_last_if()
, andranges::find_last_if_not()
P2602R2 - Poison Pills are Too Toxic
P1981R0 - Rename
leap
toleap_second
P1982R0 - Rename
link
totime_zone_link
Improvements and New Features¶
The performance of growing
std::vector
has been improved for trivially relocatable types.A lot of types are considered trivially relocatable now, including
std::vector
andstd::string
.The performance of
std::ranges::fill
andstd::ranges::fill_n
has been improved forstd::vector<bool>::iterator
s, resulting in a performance increase of up to 1400x.The
std::mismatch
algorithm has been optimized for integral types, which can lead up to 40x performance improvements.The
std::ranges::minmax
algorithm has been optimized for integral types, resulting in a performance increase of up to 100x.The
std::set_intersection
andstd::ranges::set_intersection
algorithms have been optimized to fast-forward over contiguous ranges of non-matching values, reducing the number of comparisons from linear to logarithmic growth with the number of elements in best-case scenarios.The
_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
macro has been added to make the declarations in<strstream>
available.The
_LIBCPP_ENABLE_CXX26_REMOVED_WSTRING_CONVERT
macro has been added to make the declarations in<locale>
available.The formatting library is updated to Unicode 15.1.0.
std::ignore
sconst __ignore_t& operator=(_Tp&&) const
was changed toconst __ignore_type& operator=(const _Tp&) const noexcept
for all language versions.Vendors can now configure the ABI so that
string
andvector
will use bounded iterators when hardening is enabled. Note that checks for iterator invalidation are currently not supported – any accesses made through an invalidated bounded iterator will still result in undefined behavior (bounded iterators follow the normal invalidation rules of the associated container).string
bounded iterators use the logical size of the container (index < str.size()
) whereasvector
bounded iterators use the “physical” size of the container (index < vec.capacity()
) which is a less strict check; refer to the implementation for further details.Bounded iterators can be enabled via the
_LIBCPP_ABI_BOUNDED_ITERATORS_IN_STRING
ABI macro forstring
and via the_LIBCPP_ABI_BOUNDED_ITERATORS_IN_VECTOR
ABI macro forvector
; note that checks will only be performed if the hardening mode is set tofast
or above (i.e., no checking is performed in the unchecked mode, even if bounded iterators are enabled in the ABI configuration).Note: bounded iterators currently are not supported for
vector<bool>
.In C++23 and C++26 the number of transitive includes in several headers has been reduced, improving the compilation speed.
Deprecations and Removals¶
The C++20 synchronization library (
<barrier>
,<latch>
,std::atomic::wait
, etc.) has been deprecated in language modes prior to C++20. If you are using these features prior to C++20, please update to-std=c++20
. In LLVM 20, the C++20 synchronization library will be removed entirely in language modes prior to C++20._LIBCPP_DISABLE_NODISCARD_EXT
has been removed.[[nodiscard]]
applications are now unconditional. This decision is based on LEWGs discussion on P3122 and P3162 to not use[[nodiscard]]
in the standard.The
LIBCXX_ENABLE_ASSERTIONS
CMake variable that was used to enable the safe mode has been deprecated and setting it triggers an error; use theLIBCXX_HARDENING_MODE
CMake variable with the valueextensive
instead. Similarly, the_LIBCPP_ENABLE_ASSERTIONS
macro has been deprecated (setting it to1
still enables the extensive mode in the LLVM 19 release while also issuing a deprecation warning). See the hardening documentation for more details.The base template for
std::char_traits
has been removed in LLVM 19. If you are usingstd::char_traits
with types other thanchar
,wchar_t
,char8_t
,char16_t
,char32_t
or a custom character type for which you specializedstd::char_traits
, your code will stop working. The Standard does not mandate that a base template is provided, and such a base template is bound to be incorrect for some types, which could currently cause unexpected behavior while going undetected.The
_LIBCPP_ENABLE_NARROWING_CONVERSIONS_IN_VARIANT
macro that changed the behavior for narrowing conversions instd::variant
has been removed in LLVM 19.The
_LIBCPP_ENABLE_CXX20_REMOVED_ALLOCATOR_MEMBERS
and_LIBCPP_ENABLE_CXX20_REMOVED_ALLOCATOR_VOID_SPECIALIZATION
macros have been removed in LLVM 19.The
_LIBCPP_ENABLE_CXX17_REMOVED_FEATURES
and_LIBCPP_ENABLE_CXX20_REMOVED_FEATURES
macros have been removed in LLVM 19. C++17 and C++20 removed features can still be re-enabled individually.The
_LIBCPP_INLINE_VISIBILITY
and_VSTD
macros have been removed in LLVM 19.The
_LIBCPP_ATOMIC_ONLY_USE_BUILTINS
configuration option has been removed in LLVM 19. This should not affect many users, except perhaps users using the library with-ffreestanding
with a toolchain where compiler-rt or libatomic is not available. If you are one such user, please reach out to the libc++ developers so we can collaborate on a path for supporting atomics properly on freestanding platforms.LWG3430 disallow implicit conversion of the source arguments to
std::filesystem::path
when constructingstd::basic_*fstream
. This effectively removes the possibility to directly construct astd::basic_*fstream
from astd::basic_string_view
, a input-iterator or a C-string, instead you can construct a temporarystd::basic_string
. This change has been applied to C++17 and later.The
_LIBCPP_DISABLE_ADDITIONAL_DIAGNOSTICS
macro has been removed and is not honored anymore. Additional warnings provided by libc++ as a matter of QoI will now be provided unconditionally.libc++ no longer supports
std::allocator<const T>
and containers ofconst
-qualified element type, such asstd::vector<const T>
andstd::list<const T>
. This used to be supported as an undocumented extension. If you were usingstd::vector<const T>
, replace it withstd::vector<T>
instead. The_LIBCPP_ENABLE_REMOVED_ALLOCATOR_CONST
macro can be defined to temporarily re-enable this extension to make it easier to update user code. This macro will be honored for one released and ignored starting in LLVM 20. To assist with the clean-up process, consider running your code through Clang Tidy, with std-allocator-const enabled.When configuring libc++ with localization or threads disabled, the library no longer emits an error when trying to
#include <locale>
and other such headers. Instead, those headers have no content. This is consistent with the behavior for all other libc++ carve-outs like filesystem, wide characters, a source of randomness, and others. Users that were checking whether including a header would fail (e.g. via a script or CMake’stry_compile
will experience a change in behavior).libc++ no longer supports relational comparison for
std::chrono::weekday
. The relational comparison operators were provided as an undocumented extension. If you were using relational comparison onstd::chrono::weekday
, compare the results ofc_encoding()
oriso_encoding()
instead. The_LIBCPP_ENABLE_REMOVED_WEEKDAY_RELATIONAL_OPERATORS
macro can be defined to temporarily re-enable this extension. This macro will be honored for one release and ignored starting in LLVM 20.The operators in the
rel_ops
namespace have been deprecated. The deprecation is part of the paper P0768R1 “Library Support for the Spaceship (Comparison) Operator”.
Upcoming Deprecations and Removals¶
LLVM 20¶
The
LIBCXX_ENABLE_ASSERTIONS
CMake variable and the_LIBCPP_ENABLE_ASSERTIONS
macro that were used to enable the safe mode will be removed in LLVM 20.The C++20 synchronization library will be removed entirely in language modes prior to C++20 in LLVM 20.
The relational operators for
std::chrono::weekday
will be removed entirely, and the_LIBCPP_ENABLE_REMOVED_WEEKDAY_RELATIONAL_OPERATORS
macro that was used to re-enable this extension will be ignored in LLVM 20.The
_LIBCPP_ENABLE_REMOVED_ALLOCATOR_CONST
macro will no longer have an effect.
LLVM 21¶
The status of the C++03 implementation will be frozen after the LLVM 21 release. This means that starting in LLVM 22, non-critical bug fixes may not be back-ported to C++03, including LWG issues. C++03 is a legacy platform, where most projects are no longer actively maintained. To reduce the amount of fixes required to keep such legacy projects compiling with up-to-date toolchains, libc++ will aim to freeze the status of the headers in C++03 mode to avoid unintended breaking changes. See https://discourse.llvm.org/t/rfc-freezing-c-03-headers-in-libc for more details.
If you are using C++03 in your project, you should consider moving to a newer version of the Standard to get the most out of libc++.
ABI Affecting Changes¶
The optional POSIX macro
ENODATA
has been deprecated in C++ and POSIX 2017. Therandom_device
could throw asystem_error
with this value. It now throwsENOMSG
.
Build System Changes¶
The
LIBCXX_EXECUTOR
andLIBCXXABI_EXECUTOR
CMake variables have been removed. Please setLIBCXX_TEST_PARAMS
toexecutor=<...>
instead.The CMake variable
LIBCXX_ENABLE_CLANG_TIDY
has been removed. The build system has been changed to automatically detect the presence ofclang-tidy
and the requiredClang
libraries.The CMake options
LIBCXX_INSTALL_MODULES
now defaults toON
.The CMake options
LIBCXX_BENCHMARK_NATIVE_STDLIB
andLIBCXX_BENCHMARK_NATIVE_GCC_TOOLCHAIN
have been removed. To benchmark the native standard library, configure the test suite against the native standard library directly instead.