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?¶
Implemented Papers¶
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++26P2869R4 - Remove Deprecated
shared_ptr
Atomic Access APIs from C++26P2872R3 - Remove
wstring_convert
From C++26P3142R0 - Printing Blank Lines with
println
(as DR against C++23)P2302R4 -
std::ranges::contains
P1659R3 -
std::ranges::starts_with
andstd::ranges::ends_with
P3029R1 - Better
mdspan
’s CTAD
Improvements and New Features¶
The performance of growing
std::vector
has been improved for trivially relocatable types.The performance of
ranges::fill
andranges::fill_n
has been improved forvector<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
_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
macro has been added to make the declarations in<strstream>
available.The
_LIBCPP_ENABLE_CXX26_REMOVED_SHARED_PTR_ATOMICS
macro has been added to make the declarations in<memory>
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.
Deprecations and Removals¶
The C++20 synchronization library (
<barrier>
,<latch>
,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.TODO: 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.
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.
LLVM 21¶
TODO
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.