13954 Commits

Author SHA1 Message Date
Nikhil Kotikalapudi
feae3bc202
[libc++] Remove non-standard member type iterator_type from __wrap_iter (#186871)
Resolves #186801 
Removed the non-standard member type `iterator_type` from `__wrap_iter`.
This member exposed the underlying iterator type, and its removal
prevents users from relying on the implementation detail.
2026-03-25 11:04:14 +08:00
Peter Collingbourne
30084d7476
[libc++] Fix type confusion in hash_{,multi}map
The type `__gnu_cxx::hash_{,multi}map` creates objects of type
`std::pair<Key, Value>` and returns pointers to them of type
`std::pair<const Key, Value>`. If either `Key` or `Value` are
non-standard-layout, this is UB, and is furthermore considered by
pointer field protection to be a type confusion, which leads to a
program crash. Fix it by using the correct type for the pair's storage
and using const_cast to form a pointer to the key in the one place where
that is needed.

Reviewers: ldionne

Reviewed By: ldionne

Pull Request: https://github.com/llvm/llvm-project/pull/183223
2026-03-24 15:44:54 -07:00
A. Jiang
26ee552ef5
[libc++] Fix includes in <string> for no-wchar_t modes (#187650)
Since befaa35212dbaac39cd76a8dc748e4df7c90a0d9, the CI stably failed for
the generic-no-wide-characters build, because in no-`wchar_t` modes, the
header for `__remove_cv_t` wasn't properly included.

This PR adds the missing include of `<__type_traits/remove_cv.h>`.

As drive-by, `<__cstddef/size_t.h>` and
`<__type_traits/is_constant_evaluated.h>`, which are included by
`<cwchar>`, are also made included by `<string>` to avoid potential
regression as we're using `size_t` and
`__libcpp_is_constant_evaluated()` in `<string>`.
2026-03-22 20:29:25 +08:00
Zibi Sarbinowski
fa49ad564b
[libc++] Fix random_shuffle signature in C++03 mode with frozen headers (#186443)
The frozen C++03 headers got an invalid simplification in #134045 that
changed the signature of random_shuffle to use a forwarding reference
instead of a lvalue reference. This patch fixes it and adds a test.

---------

Co-authored-by: Louis Dionne <ldionne.2@gmail.com>
2026-03-20 11:22:42 -04:00
A. Jiang
486bd96099
[libc++][NFC] Remove redundant guard for __cpp_lib_destroying_delete (#187473)
In `<version>` and test files, `__cpp_lib_destroying_delete` is already
properly guarded with standard modes, so it's redundant to say standard
revision in `test_suite_guard`/`libcxx_guard`.
2026-03-19 15:17:00 -04:00
Ross Burton
88cbac0495
[libc++] Unify python shebangs (#187258)
As per PEP-0394[1], there is no real concensus over what binary names
Python has, specifically 'python' could be Python 3, Python 2, or not
exist.

However, everyone has a python3 interpreter and the scripts are all
written for Python 3. Unify the shebangs so that the ~50% of shebangs
that use python now use python3.

[1] https://peps.python.org/pep-0394/
2026-03-19 15:16:08 -04:00
Hristo Hristov
c9f6ad8d42
[libc++][docs][NFC] Update Open XL supported version to 17.1.4 (#176112)
Open XL 17.1.4 based on LLVM21 was released:
https://www.ibm.com/docs/en/openxl-c-and-cpp-aix/17.1.4?topic=whats-new

Co-authored-by: Hristo Hristov <zingam@outlook.com>
2026-03-19 17:56:26 +02:00
Louis Dionne
e1aef9e227
[libc++] Fix missing availability check for visionOS in apple_availability.h (#187015)
Without this, we were assuming that __ulock was unavailable on visionOS
and falling back to the manual implementation, when in reality we can
always rely on the existence of ulock.

Fixes #186467
2026-03-19 11:14:12 -04:00
Nikolas Klauser
befaa35212
[libc++] Fix passing through object to comparisons in __tree (#186341)
Fixes #180659
2026-03-18 14:23:01 -04:00
Louis Dionne
3e09538a42
[libc++] Expand test coverage for converting comparators in associative containers (#187133)
This is in preparation for fixing #187105.
2026-03-18 14:22:22 -04:00
Louis Dionne
fc569dafd7
[libc++] Refactor __is_transparent_v to make it clear what it depends on (#186419)
__is_transparent_v used to accept an additional _Key template argument
whose sole purpose was to make the instantiation as a whole dependent.
It turns out that creates confusion around whether that trait takes into
account the key type (it does not). Instead, we can use our traditional
approach for making template params artificially dependent, which allows
removing the confusing parameter.

For disclaimer, I authored this patch with Claude code just to see if I
could get it to do the right thing. It works, but you have to steer it
right.

Fixes #186417
2026-03-18 10:53:47 -04:00
Louis Dionne
fec11e3e5f
[libc++] Add scripts defining two LNT runners for libc++ (#187050) 2026-03-17 12:15:56 -04:00
Louis Dionne
3ae428ff3a
[libc++][NFC] Rename the template parameter of __make_transparent (#186435)
Renaming from _Tp to _ArgumentType makes it clearer that we're passing
the argument type intended for the comparator, which allows checking
whether *that specific use* of the comparator would be transparent.

Fixes #186396
2026-03-17 10:15:37 -04:00
Louis Dionne
0eefb2682b
[libc++] Build the library with C++26 (#181021)
All supported compilers support C++26. This allows simplifying some of
the upcoming <text_encoding> implementation.
2026-03-17 09:05:51 -04:00
Nikolas Klauser
c2e739f3bb
[libc++] Avoid including <cmath> in <format> (#186332)
This reduces the time to parse `<format>` a bit.
2026-03-16 11:27:21 +01:00
Jake Egan
3fea2f6165
[libc++][test] Use loop with compare_exchange_weak calls (#185953)
On AIX, this test sometimes fails with error `Assertion failed: y ==
true`. The test assumes `compare_exchange_weak` should succeed on a
single call, however according to the standard:

> A weak compare-and-exchange operation may fail spuriously. That is,
even when the contents of memory referred to by expected and ptr are
equal, it may return false and store back to expected the same memory
contents that were originally there.
This spurious failure enables implementation of compare-and-exchange on
a broader class of machines, e.g., load-locked store-conditional
machines. A consequence of spurious failure is that nearly all uses of
weak compare-and-exchange will be in a loop.

[atomics.ref.ops]/27
2026-03-14 22:34:48 -04:00
Sharjeel Khan
5f479438dd
[libc++][Android] Update Compiler for Android CI (#186531)
Upgrade Android compiler from r563880 to r584948b because libc++ does
not support LLVM 20 anymore
2026-03-14 14:48:08 -07:00
Nikolas Klauser
7ba7d76c86
[libc++] Make the associative container query benchmarks more representative (#183036)
Currently the query benchmarks are training the branch predictor
incredibly well, which isn't representative of the real world. This
change causes the branch misses to go from <1% to ~50% with the current
implementation of `__tree::__find_end`.

This patch also removes the `non-existent` benchmarks, since it'd be
non-trivial to write a representative benchmark for that case, and the
benchmark would be relatively low value. We're already searching to leaf
nodes ~50% of the time (since half the nodes are leaves) with the
current benchmark. So we'd only additionally cover a relatively trivial
failure branch that is only taken once per function call. The loop is
already covered through benchmarking with keys existing in the
container.
2026-03-13 09:48:07 -04:00
Dimitrij Mijoski
1616fbaccf
[libc++] Fix checks for terminal and flushes in std::print() (#70321)
The check whether a stream is associated with a terminal or not and the
flushing of the stream in `std::print()` is needed only on Windows.
Additionally, the correct flush should be used. When `std::print` is
called with a C stream, `std::fflush()` should be used. When it is
called with C++ `ostream`, `ostream::flush()` should be called.

Because POSIX does not have a separate Unicode API for terminal output,
checking for terminal (`isatty`) and flushing is not needed at all.
Moreover, `isatty` has noticeable performance cost.

See also https://wg21.link/LWG4044.

Fixes #70142
2026-03-12 10:58:36 +01:00
Nikolas Klauser
c1d26c3c25
[libc++] Fix iostream size ABI break (#185839)
In #124103 we changed the size of various iostream objects, which turns
out to be ABI breaking when compiling non-PIE code.

This ABI break is safe to fix, since for any programs allocating more
memory for the iostream objects, the remaining bytes are simply unused
now.

Fixes #185724
2026-03-12 10:18:25 +01:00
Louis Dionne
b90f606c58
[libc++] Rename container benchmarks for consistency and precision (#181178) 2026-03-11 13:49:09 -04:00
Nikolas Klauser
18b70cebc9
[libc++] Switch to the new docker image in the CI (#185843)
This also simplifies the workflow file a bit and removes a redundant
`generic-cxx26` configuration in stage 3.
2026-03-11 17:09:44 +01:00
Nikolas Klauser
71608f4ce3
[libc++] Update the libcxx-next-runners image (#185871) 2026-03-11 13:53:24 +01:00
Louis Dionne
c7aaaeaef4
[libc++] Rename a few benchmarks to allow identifying what's being benchmarked from the name (#185747) 2026-03-11 08:15:02 -04:00
Nikolas Klauser
1930089f25
[libc++] Update the docker base image version (#185863) 2026-03-11 12:52:03 +01:00
Nikolas Klauser
e9437d01e4
[libc++] Install build-essential in the CI docker container (#185853)
We don't install a compiler via `apt` anymore, so we need to explicitly
install the utilities required to build stuff.
2026-03-11 11:35:57 +01:00
Louis Dionne
b22c6b41af
[libc++][NFC] Merge libc++ specific test directories for std::string (#185717)
String tests do not belong under `containers/`.
2026-03-11 09:17:20 +01:00
Nikolas Klauser
e1fcdc455f
[libc++] Update the libcxx-next-runners to use the new docker image (#185603) 2026-03-10 14:20:20 +01:00
Nikolas Klauser
15bcae5e3b
[libc++] Drop the unrepresentative search_n benchmark (#184783)
This benchmark isn't very good at benchmarking `search_n`, since a good
`search_n` implementation can go through it in ~10 perfectly predictable
steps. We can drop it to avoid spending unnecessary resources. This also
fixes that the two benchmark sets have identical names.

Fixes #183832
2026-03-10 10:40:12 +01:00
Nikolas Klauser
1729480d24
[libc++] Reduce the amount of formatter code included in <vector> (#178683)
`formatter::parse` and `formatter::format` only have to accept
`basic_format_parse_context` and `basic_format_context` respectively,
which are only guaranteed to be provided via `<format>`. This allows us
to only declare the functions for `formatter<bool>` in `<vector>` and
define them if `<format>` is included. This reduces the amount of time
it takes to parse `<vector>` by ~15% on my system.
2026-03-10 09:34:15 +01:00
Nikolas Klauser
3a03764cc1
[libc++] Update the docker base image version (#185592)
This updates the base image version so we can update our compilers.
2026-03-10 09:11:37 +01:00
A. Jiang
fe04edc5a0
[libc++] Fix strict aliasing violation for deque::const_iterator (#136067)
When the allocators use fancy pointers, the internal map of `deque`
stores `FancyPtr<T>` objects, and the previous strategy accessed these
objects via `const FancyPtr<const T>` lvalues, which usually caused core
language undefined behavior. Now `const_iterator` stores `FancyPtr<const
FancyPtr<T>>` instead of `FancyPtr<const FancyPtr<const T>>`, and ABI
break can happen when such two types have incompatible layouts.

This is necessary for reducing undefined behavior and `constexpr`
support for `deque` in C++26, and I currently don't want to provide any
way to opt-out of that behavior.

For `iterator`, the current strategy makes it store
`FancyPtr<FancyPtr<T>>`. But it would make more sense to also store
`FancyPtr<const FancyPtr<T>>` because we never modify the map via
`iterator`.

For some pathological combinations of allocators and fancy pointers, the
rebinding trick doesn't work. These cases are rejected by
`static_assert`.

The existing test coverage seems to be sufficient.
2026-03-10 16:00:38 +08:00
William Tran-Viet
54b671e054
[libc++][NFC] Simplify most of optional.observe (#185252)
- Hoist `operator*()`, `operator->()`, `value()` into their respective
`optional_storage_base` to reduce the amount of concepts flying around.
- `value_or()` has been deliberately left out since that seems to
produce extra (superfluous) error messages during invalid template
instantiation.
2026-03-10 13:48:32 +08:00
Nikolas Klauser
9b04a3cd39
[libc++] Use compiler explorer for Clang as well and update to LLVM 23 as head (#185168)
Using the compiler explorer infrastucture simplifies the dockerfile a
bit, since we have a single source for compilers now instead of two
independent ones. compiler explorer is also usually significantly faster
at providing new versions than apt.llvm.org.
2026-03-09 18:01:52 +01:00
William Tran-Viet
a2231642b3
[libc++][NFC] Simplify optional::iterator (#183230)
- Rename `__optional_iterator` into `__optional_iterator_base` and make
it part of the `__optional_{meow}_base` inheritance chain. This allows
us to get rid of a sketchy-looking downcast and shorten some code.
2026-03-08 09:58:06 +08:00
Louis Dionne
d7ff97db15
[libc++] Support build failures when running LNT benchmarks (#185234)
It's rare but possible for the codebase not to build. When that happens,
we should carry on and still submit an empty LNT report for that order,
otherwise we'll get stuck thinking that order hasn't been benchmarked
yet.
2026-03-07 22:23:11 +00:00
Nikolas Klauser
861b9cacdc
[libc++] Fix std::variant comparators not working on recursive instantiations (#182238)
We currently have an instantiation cycle in `variant`'s comparison
operators. This patch fixes that by replacing a `decltype(auto)` with an
explicit return type, removing the requirement to instantiate the
function in order to know the return type.

Fixes #182232
2026-03-07 10:13:34 +01:00
Nikolas Klauser
e830ee8006
[libc++] Don't double-wrap iterators when bounded iterators are used (#182264)
There is no reason to double-wrap iterators, since we can already
achieve anything we want within `__bounded_iter`itself.

This is technically ABI breaking, but people using bounded iterators
shouldn't require ABI stability currently.

Fixes #178521
2026-03-07 09:12:25 +01:00
Christopher Di Bella
01a97050f0
Revert "[libcxx] adds __split_buffer::__swap_layouts" (#185120)
Reverts llvm/llvm-project#180102
2026-03-06 22:31:42 +00:00
Christopher Di Bella
65f39a16ab
[libcxx] Add __split_buffer::__swap_layouts (#180102)
This commit simplifies the cumbersome process of swapping the respective
layout members for `__split_buffer` and `vector`.
2026-03-06 21:57:03 +00:00
William Fynn
832517f28d
[libc++] Add alias template for __strip_signature::type (#181955)
Simplifying the internal implementation by providing a more concise
way to access the underlying type within the __strip_signature class.
2026-03-06 17:49:39 +00:00
Vitaly Buka
fb7d25556a
[libc++][string] Replace ASAN volatile wrapper with memory barrier (#184693)
The previous `_LIBCPP_ASAN_VOLATILE_WRAPPER` approach was used to
prevent
speculative loads of string data before the short/long state was
determined. This patch replaces that mechanism with a more explicit
`__annotate_memory_barrier()` using an empty volatile assembly block.

This PR is inspired by #183457 and by downstream false positive on
`__get_long_size`. It fails same way as `__get_long_pointer` before we
have
`_LIBCPP_ASAN_VOLATILE_WRAPPER`. Barrier approach avoids
expanding `_LIBCPP_ASAN_VOLATILE_WRAPPER` for size_t, and to
in general looks more readable.

I failed to create reasonable reproducer for test, I suspect it requires
precise set of compiler flags, and libc++ site_config which will be hard
to maintain in test.
2026-03-05 21:09:53 -08:00
William Tran-Viet
65d378d82d
[libc++] Remove __wrap_iter::base() (#179389)
Resolves #126442

- Converts all the relevant functions that used `.base()` into friends
- Fixed usage in `<regex>`

---------

Co-authored-by: A. Jiang <de34@live.cn>
2026-03-05 20:06:46 +08:00
Nikolas Klauser
8fcb60aa47
[libc++][NFC] Introduce __data() to std::string to replace std::__to_address(__get_pointer()) (#178212)
`std::__to_address(__get_pointer())` is an extremely common pattern
inside `string` and is basically equivalent to `data()`, except that
`data()` only returns a non-const pointer since C++17. This patch
introduces `__data()` to back-port returning a non-const pointer.
2026-03-04 10:19:34 +01:00
Louis Dionne
a5ca0ec16b
[libc++] Update documentation for _executeWithFakeConfig (#184420) 2026-03-03 19:25:11 +00:00
Louis Dionne
4f91d0b322
[libc++] Give proper names to a few benchmarks (#183333) 2026-03-02 16:10:57 -08:00
Nikolas Klauser
0a9b5d5218
[libc++] Forward find* algorithms to find_if (#179938)
This propagates any optimizations to the whole family of `find`
functions.
2026-02-27 14:48:58 -08:00
Nikolas Klauser
d6fcf47a89
[libc++] Fix vector::append_range growing before the capacity is reached (#183264)
Currently `vector::append_range` grows even when appending a number of
elements that is exactly equal to its spare capacity, which is
guaranteed by the standard to _not_ happen.

Fixes #183256
2026-02-27 11:12:17 +01:00
Louis Dionne
5de92856bd
[libc++] Introduce a escape hatch for the changed behavior of map and set search operations (#183190)
In #155245, we implemented an optimization to std::map and std::set
search operations. That optimization took advantage of something that is
guaranteed by the Standard, namely that the comparator provided to the
associative container is a valid strict weak ordering.

Sadly, some code in the wild did not satisfy this requirement, such as
Boost.ICL: boostorg/icl#51

Since this can have extremely tricky runtime consequences, this patch
introduces a temporary escape hatch for the LLVM 22 release that allows
reverting to the previous behavior. It also explicitly calls out the
change in the release notes, adds some regression tests and adds debug
mode support for catching some of these invalid predicates.

Fixes #183189
2026-02-26 10:22:59 -05:00
Nikolas Klauser
b101f01382
[libc++] Optimize using std::copy with an ostreambuf_iterator (#181815)
```
Benchmark                                                  old             new    Difference    % Difference
----------------------------------------------  --------------  --------------  ------------  --------------
std::copy(CharT*,_CharT*,_ostreambuf_iterator)         8115.45          329.54      -7785.91         -95.94%
```
2026-02-26 12:01:07 +01:00