362 Commits

Author SHA1 Message Date
Louis Dionne
5801090258 [libc++] Fix bug in allocate_shared_for_overwrite
Instead of destroying the object with allocator::destroy, we must
call its destructor directly. As a fly-by also mark LWG3008 as
fixed since it is handled by our implementation.

This was pointed out by Tim Song in https://reviews.llvm.org/D140913.

Differential Revision: https://reviews.llvm.org/D143791
2023-02-13 08:50:54 -05:00
Louis Dionne
87cc95a904 [libc++] Implement P2136R3 std::invoke_r
Differential Revision: https://reviews.llvm.org/D143610
2023-02-13 08:46:57 -05:00
Adrian Vogelsgesang
2a06757a20 [libc++][spaceship] Implement lexicographical_compare_three_way
The implementation makes use of the freedom added by LWG 3410. We have
two variants of this algorithm:
* a fast path for random access iterators: This fast path computes the
  maximum number of loop iterations up-front and does not compare the
  iterators against their limits on every loop iteration.
* A basic implementation for all other iterators: This implementation
  compares the iterators against their limits in every loop iteration.
  However, it still takes advantage of the freedom added by LWG 3410 to
  avoid unnecessary additional iterator comparisons, as originally
  specified by P1614R2.

https://godbolt.org/z/7xbMEen5e shows the benefit of the fast path:
The hot loop generated of `lexicographical_compare_three_way3` is
more tight than for `lexicographical_compare_three_way1`. The added
benchmark illustrates how this leads to a 30% - 50% performance
improvement on integer vectors.

Implements part of P1614R2 "The Mothership has Landed"

Fixes LWG 3410 and LWG 3350

Differential Revision: https://reviews.llvm.org/D131395
2023-02-12 14:51:08 -08:00
Adrian Vogelsgesang
bb00fb66ba [libc++][NFC] Fix formatting in ranges status page 2023-02-12 12:06:17 -08:00
Louis Dionne
1cf344d946 [libc++] Implement LWG3657 std::hash<filesystem::path>
This is implemented as a DR on top of C++17.

Differential Revision: https://reviews.llvm.org/D143452
2023-02-07 22:06:17 -08:00
Louis Dionne
16a1c85171 [libc++] Implement P1328R1 constexpr std::type_info::operator==
Differential Revision: https://reviews.llvm.org/D143447
2023-02-07 17:03:45 -08:00
Mark de Wever
a125659f5e [NFC][libc++] Addresses LWG3781.
LWG3781 The exposition-only alias templates cont-key-type and
  cont-mapped-type should be removed

Libc++ never implemented these aliases.

Reviewed By: #libc, philnik, ldionne

Differential Revision: https://reviews.llvm.org/D142912
2023-01-31 20:09:05 +01:00
Mark de Wever
f02c9e6f26 [libc++] Addresses LWG3755.
LWG3755 tuple-for-each can call user-defined operator,

Reviewed By: #libc, ldionne, philnik

Differential Revision: https://reviews.llvm.org/D142909
2023-01-31 20:08:07 +01:00
Mark de Wever
26597bf141 [libc++] Marks LWG2970 as complete.
LWG2970 Return type of std::visit misspecified

Was applied in D86006 including tests.

Reviewed By: #libc, ldionne

Differential Revision: https://reviews.llvm.org/D142840
2023-01-31 20:02:45 +01:00
Mark de Wever
87451cf05a [libc++] Partly addresses LWG3798.
LWG3798 Rvalue reference and iterator_category

The changes are only applied to `ranges::transform_view`, the other
views haven't been implemented yet.

Reviewed By: #libc, ldionne

Differential Revision: https://reviews.llvm.org/D142815
2023-01-31 20:00:40 +01:00
Mark de Wever
76804e89b3 [libc++] Addresses LWG3764.
LWG3764 reference_wrapper::operator() should propagate noexcept

As drive-by adds constexpr to the synopsis, since it has already been
implemented.

Reviewed By: #libc, ldionne

Differential Revision: https://reviews.llvm.org/D142814
2023-01-31 19:59:16 +01:00
Mark de Wever
a3bfd2bc48 [libc++] Addresses LWG3754
LWG3754 Class template expected synopsis contains declarations that do
  not match the detailed description

This parts of the detailed synopsis that is not copied in libc++, so
effectively there's nothing to do.

Reviewed By: #libc, philnik

Differential Revision: https://reviews.llvm.org/D142809
2023-01-28 18:15:48 +01:00
Mark de Wever
7c3a7c727b [libc++][doc] Updates format status.
The paper
- P2286R8 Formatting ranges
is fully implemented modulo its feature test macro. This macro has been
revised by
- LWG3750 Too many papers bump __cpp_lib_format
The new macro depends on
- P2585R0 Improving default container formatting
This paper revises parts of P2286R8 and adds new formatter
specializations. The specialization for debug strings has some wording
issues, which is addresses in this paper
- P2733R0 Fix handling of empty specifiers in std::format

Reviewed By: #libc, ldionne

Differential Revision: https://reviews.llvm.org/D142153
2023-01-24 17:20:56 +01:00
Hui
a2b3ab8f77 [libc++][ranges] implement std::ranges::split_view
- implement `std::ranges::split_view` (last c++20 view)
- Work in process on testing iterator/sentinel, but since we are
getting closer to the deadline, I'd like to send the review early

Differential Revision: https://reviews.llvm.org/D142063
2023-01-24 09:03:33 +00:00
Hui
9af9d39a47 [libc++] implement P1020R1 P1973R1 make_unique[shared]_for_overwrite
Differential Revision: https://reviews.llvm.org/D140913
2023-01-23 21:07:22 +00:00
Mark de Wever
4f7d7eb98a [libc++][doc] Fixes the usage of improper markup. 2023-01-23 18:26:18 +01:00
Nikolas Klauser
987f08fe22 [libc++] Implement P1413R3 (Deprecate std::aligned_storage and std::aligned_union)
There are no tests for the aliases because clang doesn't diagnose deprecated template aliases currently.

Reviewed By: ldionne, #libc

Spies: libcxx-commits

Differential Revision: https://reviews.llvm.org/D127678
2023-01-21 15:08:27 +01:00
Mark de Wever
857cbb9276 [libc++][format] range-default-formatter for set.
Implements the range-default-formatter specialization range_format::set.

Implements parts of
- P2286R8 Formatting Ranges
- P2585R0 Improving default container formatting

Depends on D140801

Reviewed By: ldionne, #libc

Differential Revision: https://reviews.llvm.org/D141195
2023-01-20 17:39:59 +01:00
Nikolas Klauser
79b917b6e8 [libc++] Mark LWG3349 as complete 2023-01-20 07:06:50 +01:00
Nikolas Klauser
b40a3d73dc [libc++] Implement P2446R2 (views::as_rvalue)
Reviewed By: ldionne, var-const, #libc

Spies: libcxx-commits

Differential Revision: https://reviews.llvm.org/D137637
2023-01-20 06:00:40 +01:00
Mark de Wever
af5fc4b4d8 [libc++][format] range-default-formatter for map
Implements the range-default-formatter specialization range_format::map.

Implements parts of
- P2286R8 Formatting Ranges
- P2585R0 Improving default container formatting

Depends on D140653

Reviewed By: ldionne, #libc

Differential Revision: https://reviews.llvm.org/D140801
2023-01-19 20:55:52 +01:00
Mark de Wever
a09b1dc1f2 [libc++][format] Adds formatter std::vector<bool>.
Implements parts of
- P2286R8 Formatting Ranges

Depends on D140653

Reviewed By: ldionne, #libc

Differential Revision: https://reviews.llvm.org/D141761
2023-01-19 17:58:05 +01:00
Mark de Wever
04d4f4b3d4 [libc++][format] Adds container adaptor formatters.
Implements parts of
- P2286R8 Formatting Ranges

Depends on D140653

Reviewed By: ldionne, #libc

Differential Revision: https://reviews.llvm.org/D141290
2023-01-19 17:50:16 +01:00
Mark de Wever
22e8525dfd [libc++][format] Implements range_formatter
Implements parts of
- P2286R8 Formatting Ranges
- P2585R0 Improving default container formatting

Depends on D140651

Reviewed By: ldionne, #libc

Differential Revision: https://reviews.llvm.org/D140653
2023-01-19 17:20:05 +01:00
Haojian Wu
d8a1d5024f [libc++][ranges] Remove a leftover include version control markers in Cxx20Papers.csv 2023-01-18 12:05:54 +01:00
Konstantin Varlamov
d94b069a89 [libc++][ranges] Mark completed Ranges papers and issues as done, bump version macro
All C++20 Ranges papers and LWG issues are done, with the exception of
https://wg21.link/P2210R2 ("Superior String Splitting"), and marked as
such.

All of these were already implemented prior to this patch except bumping
the feature test macro `__cpp_lib_ranges` as required by
https://wg21.link/P2325R3 ("Views should not be required to be default
constructible"). Note that, even though P2325R3 was voted into C++23, it
was voted with a recommendation for vendors to retroactively apply the
change to C++20 (see https://github.com/cplusplus/papers/issues/1007).

Differential Revision: https://reviews.llvm.org/D139900
2023-01-17 22:54:00 -08:00
Hui Xie
94461822c7 [libc++][ranges] implement std::views::elements_view
`subrange` is also a `tuple-like`. To avoid the add entire `subrange` dependencies to `tuple-like`, we need forward declaration of `subrange`. However, the class template constraints of `subrange` currently requires `__iterator/concepts.h`, which requires `<concepts>`. The problem is that currently `tuple-like` is used in several different places, including libc++ extension for pair constructors. we don't want to add `<concepts>` to pair and other stuff. So this change also created several small headers that `subrange`'s declaration needed inside `__iterator/concepts/`

Differential Revision: https://reviews.llvm.org/D136268
2023-01-15 17:36:10 +00:00
Mark de Wever
a9a6f977bb [libc++][doc] Updates the release notes.
This is a preparation for the upcoming LLVM 17 release.

Reviewed By: ldionne, philnik, avogelsgesang, jloser, #libc

Differential Revision: https://reviews.llvm.org/D141304
2023-01-13 17:46:45 +01:00
Arthur O'Dwyer
64fc3cd55d [libc++] Hold mutex lock while notify_all is called at notify_all_at_thread_exit
Releasing the mutex before the call to notify_all is an optimization.
This optimization cannot be used here. The thread waiting on the
condition might destroy the associated resources — mutex + condition
variable — and the notifier thread will access an destroyed variable
— the condition variable. In fact, notify_all_at_thread_exit is meant
exactly to join on detached threads, and the waiting thread doesn't
expect for the notifier thread to access any further shared resources,
making this scenario very likely to happen. The waiting thread might
awake spuriously on the release of the mutex lock. The reorder is
necessary to prevent this race.

Further details can be found at https://cplusplus.github.io/LWG/issue3343.

Differential Revision: https://reviews.llvm.org/D105758
2023-01-11 17:01:21 -05:00
James Y Knight
73d94b1916 [Libcxx] Add <source_location> header.
This requires the __builtin_source_location() builtin, as implemented
by GCC and Clang.

Fixes https://github.com/llvm/llvm-project/issues/56363

Differential Revision: https://reviews.llvm.org/D120634
2023-01-11 16:01:30 -05:00
Louis Dionne
e4897c7c43 [libc++][NFC] Improve consistency in status csv files 2023-01-11 10:30:49 -05:00
Marek Kurdej
7223bcf04c [libc++] [C++20] [P0415] Constexpr for std::complex.
This patch adds constexpr to <complex> header: operators, member operators, and member functions (real, imag, norm, conj).

https://eel.is/c++draft/complex.numbers
https://wg21.link/p0415

Reviewed By: ldionne, #libc

Spies: philnik, danilaml, Quuxplusone, wmaxey, arichardson, libcxx-commits

Differential Revision: https://reviews.llvm.org/D79555
2023-01-08 15:46:51 +01:00
Nikolas Klauser
52bff450dd [libc++] Implement constexpr {isfinite, isinf, isnan, isnormal}
This starts implementing P0533

Reviewed By: Mordante, #libc

Spies: libcxx-commits

Differential Revision: https://reviews.llvm.org/D140277
2022-12-25 20:14:29 +01:00
Mark de Wever
105fef5dca [libc++][chrono] Add calendar type formatters.
Some of the calendar types have landed before, this adds the missing
set. Note this does not complete the implementation of the chrono
formatters.

This removes the `chrono` header for some transitive include in C++17
mode. This is needed to avoid inclusion cycles.

Partially implements:
- P1361 Integration of chrono with text formatting
- P2372 Fixing locale handling in chrono formatters

Reviewed By: #libc, ldionne

Differential Revision: https://reviews.llvm.org/D137022
2022-12-24 15:11:41 +01:00
Mark de Wever
0edc92e6e0 [libc++] LWG3738 Validates a missing precondition.
No real changes were needed, but add an assert for the pre-condition.

This implements:
- 3738 Missing preconditions for take_view constructor

Reviewed By: #libc, philnik

Differential Revision: https://reviews.llvm.org/D140568
2022-12-23 17:20:57 +01:00
Mark de Wever
83c1816224 [libc++] LWG3745 noexcept for atomic_wait.
The noexcept was already implemented, this only updates the synposis and
adds tests to validate that the functions are noexcept.

This implements:
- LWG3745 std::atomic_wait and its friends lack noexcept

Reviewed By: #libc, philnik

Differential Revision: https://reviews.llvm.org/D140575
2022-12-23 17:17:00 +01:00
Mark de Wever
eb6e13cb32 [libc++][format] Adds formatter for tuple and pair
Implements parts of
- P2286R8 Formatting Ranges

Reviewed By: ldionne, #libc

Differential Revision: https://reviews.llvm.org/D136775
2022-12-22 19:36:28 +01:00
Mark de Wever
2b6ce25a2a [libc++] Adds __cpp_lib_constexpr_algorithms to utility.
Implements:
- LWG3792 __cpp_lib_constexpr_algorithms should also be defined in <utility>

Depends on D140407

Reviewed By: #libc, philnik, ldionne

Differential Revision: https://reviews.llvm.org/D140413
2022-12-21 17:30:16 +01:00
Mark de Wever
44ea075d9c [libc++][doc] Adds Kona plenary papers and issues.
Directly marked entries with Nothing to do where applicable.

Reviewed By: #libc, ldionne

Differential Revision: https://reviews.llvm.org/D140407
2022-12-21 17:29:02 +01:00
Igor Zhukov
c45f382a12 Implement LWG-3646 std::ranges::view_interface::size returns a signed type
Reviewed By: Mordante, philnik, #libc

Differential Revision: https://reviews.llvm.org/D139791
2022-12-16 07:14:00 +07:00
Nikolas Klauser
3ec6c997c6 [libc++] Implement P1169R4 (static operator())
Reviewed By: ldionne, huixie90, #libc

Spies: EricWF, libcxx-commits, royjacobson

Differential Revision: https://reviews.llvm.org/D135016
2022-12-15 02:18:54 +01:00
Hui Xie
e356f681f6 [libc++] Implement std::expected P0323R12
Implement `std::expected` https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p0323r12.html

Added tests

Differential Revision: https://reviews.llvm.org/D124516

address comment
2022-12-14 15:43:42 +00:00
Konstantin Varlamov
21ca9c8d28 [libc++][ranges][NFC] Update Ranges status.
Add a link to an in-progress patch.
2022-12-09 19:32:18 -08:00
Nikolas Klauser
181cce6b69 [libc++] Implement P0339R6 (polymorphic_allocator<> as a vocabulary type)
Reviewed By: ldionne, #libc

Spies: LRFLEW, libcxx-commits, arichardson, krytarowski, jdoerfert

Differential Revision: https://reviews.llvm.org/D137739
2022-12-07 18:50:26 +01:00
varconst
2c5a548b53 [libc++][ranges][NFC] Revamp the Ranges status page
Focus on the not-yet-implemented features: remove most details about the
already-implemented C++20 stuff, list out the major C++23 additions.

Differential Revision: https://reviews.llvm.org/D136657
2022-11-29 14:40:35 -08:00
Nikolas Klauser
65df5bf2d1 [lbc++] Implement the rest of P0600R1 (nodiscard in the library)
Reviewed By: ldionne, #libc

Spies: libcxx-commits

Differential Revision: https://reviews.llvm.org/D137597
2022-11-29 19:42:38 +01:00
Nikolas Klauser
c418dccdbd [libc++] Remove P1908 from the status page
The paper doesn't include anything affecting the library. AFAICT there isn't even anything to do for the compiler, since it just reserved the std attribute namespace.

Reviewed By: ldionne, #libc

Spies: libcxx-commits

Differential Revision: https://reviews.llvm.org/D138128
2022-11-24 14:10:19 +01:00
Nikolas Klauser
29378ab24b [libc++] Implement P2438R2 (std::string::substr() &&)
This doesn't affect our ABI because `std::string::substr()` isn't in the dylib and the mangling of `substr() const` and `substr() const&` are different.

Reviewed By: ldionne, Mordante, var-const, avogelsgesang, #libc

Spies: arphaman, huixie90, libcxx-commits

Differential Revision: https://reviews.llvm.org/D131668
2022-11-02 20:28:47 +01:00
Mark de Wever
883b749779 [libc++][doc] Updates implementation status.
Claim some tasks for formatting and mark some parts as complete, which
was missed in the commits completing the task.

Reviewed By: #libc, ldionne

Differential Revision: https://reviews.llvm.org/D137014
2022-11-01 20:22:57 +01:00
Mark de Wever
45f81e904f [libc++] Validates valid weekday indexed range.
No code changes, but only increased the range in the tests.

Completes:
- LWG3273. Specify weekday_indexed to range of [0, 7]

Reviewed By: #libc, ldionne

Differential Revision: https://reviews.llvm.org/D137015
2022-11-01 20:20:57 +01:00