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 to complex

  • P2495R3 - Interfacing stringstreams with string_view

  • P2302R4 - std::ranges::contains

  • P1659R3 - std::ranges::starts_with and std::ranges::ends_with

Improvements and New Features

  • The performance of growing std::vector has been improved for trivially relocatable types.

  • The performance of ranges::fill and ranges::fill_n has been improved for vector<bool>::iterators, 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.

Deprecations and Removals

  • 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 the LIBCXX_HARDENING_MODE CMake variable with the value extensive instead. Similarly, the _LIBCPP_ENABLE_ASSERTIONS macro has been deprecated (setting it to 1 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 using std::char_traits with types other than char, wchar_t, char8_t, char16_t, char32_t or a custom character type for which you specialized std::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 in std::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.

  • TODO: 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.

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

TODO

Build System Changes

  • The LIBCXX_EXECUTOR and LIBCXXABI_EXECUTOR CMake variables have been removed. Please set LIBCXX_TEST_PARAMS to executor=<...> instead.