summaryrefslogtreecommitdiff
path: root/libstdc++-v3/include
Commit message (Collapse)AuthorAgeFilesLines
* libstdc++: Add std::atomic<shared_ptr>(nullptr_t) constructor (LWG 3661)Jonathan Wakely2022-04-261-0/+4
| | | | | | | | | | | This DR was approved at the February 2022 plenary. libstdc++-v3/ChangeLog: * include/bits/shared_ptr_atomic.h (atomic<shared_ptr>): Add constructor for constant initialization from nullptr_t. * testsuite/20_util/shared_ptr/atomic/atomic_shared_ptr.cc: Check for new constructor.
* libstdc++: Define std::hash<std::filesystem::path> (LWG 3657)Jonathan Wakely2022-04-261-0/+10
| | | | | | | | | | This DR was approved at the February 2022 plenary. libstdc++-v3/ChangeLog: * include/bits/fs_path.h (hash<filesystem::path>): Define. * testsuite/27_io/filesystem/path/nonmember/hash_value.cc: Check std::hash specialization.
* libstdc++: Implement constexpr std::unique_ptr for C++23 (P2273R3)Jonathan Wakely2022-04-253-21/+112
| | | | | | | | | | | | | | | | | | | | | libstdc++-v3/ChangeLog: * include/bits/ptr_traits.h (__cpp_lib_constexpr_memory): Define conditionally. * include/bits/unique_ptr.h (__cpp_lib_constexpr_memory): Define for C++23. (default_delete, default_delete<T[]>, __uniq_ptr_impl) (unique_ptr, unique_ptr<T[], D>): Add constexpr to all member functions. * include/std/version (__cpp_lib_constexpr_memory): Define new value for C++23. * testsuite/20_util/unique_ptr/assign/constexpr.cc: New test. * testsuite/20_util/unique_ptr/comparison/constexpr.cc: New test. * testsuite/20_util/unique_ptr/cons/constexpr_c++20.cc: New test. * testsuite/20_util/unique_ptr/creation/constexpr.cc: New test. * testsuite/20_util/unique_ptr/modifiers/constexpr.cc: New test. * testsuite/20_util/unique_ptr/specialized_algorithms/constexpr.cc: New test.
* libstdc++: Add deduction guides for std::packaged_task [PR105375]Jonathan Wakely2022-04-251-0/+11
| | | | | | | | | | | | This change was LWG 3117. The test is copied from 20_util/function/cons/deduction.cc libstdc++-v3/ChangeLog: PR libstdc++/105375 * include/std/future (packaged_task): Add deduction guides. * testsuite/30_threads/packaged_task/cons/deduction.cc: New test.
* libstdc++: Make atomic notify_one and notify_all non-constThomas W Rodgers2022-04-222-12/+12
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | <recording this here for future reference> PR102994 "atomics: std::atomic<ptr>::wait is not marked const" raises the issue that the current libstdc++ implementation marks the notify members const, the implementation strategy used by libstdc++, as well as libc++ and the Microsoft STL, do not require the atomic to be mutable (it is hard to conceive of a desirable implementation approach that would require it). The original paper proposing the wait/notify functionality for atomics (p1185) also had these members marked const for the first three revisions, but that was changed without explanation in r3 and subsequent revisions of the paper. After raising the issue to the authors of p1185 and the author of the libc++ implementation, the consensus seems to be "meh, it's harmless" so there seems little appetite for an LWG issue to revisit the subject. This patch changes the libstdc++ implementation to be in agreement with the standard by removing const from those notify_one/notify_all members. libstdc++-v3/ChangeLog: PR libstdc++/102994 * include/bits/atomic_base.h (atomic_flag::notify_one, notify_all): Remove const qualification. (__atomic_base::notify_one, notify_all): Likewise. * include/std/atomic (atomic<bool>::notify_one, notify_all): Likewise. (atomic::notify_one, notify_all): Likewise. (atomic<T*>::notify_one, notify_all): Likewise. (atomic_notify_one, atomic_notify_all): Likewise. * testsuite/29_atomics/atomic/wait_notify/102994.cc: Adjust test to account for change in notify_one/notify_all signature.
* libstdc++: Avoid ASCII assumptions in floating_from_chars.ccPatrick Palka2022-04-211-9/+3
| | | | | | | | | | | | | | | | | | | | In starts_with_ci and in __floating_from_chars_hex's inf/nan handling, we were assuming that the letters are contiguous and that 'A' + 32 == 'a' which is true for ASCII but not for other character encodings. This patch fixes starts_with_ci by using a constexpr lookup table that maps uppercase letters to lowercase, and fixes __floating_from_chars_hex by using __from_chars_alnum_to_val. libstdc++-v3/ChangeLog: * include/std/charconv (__from_chars_alnum_to_val_table): Simplify initialization of __lower/__upper_letters. (__from_chars_alnum_to_val): Default the template parameter to false. * src/c++17/floating_from_chars.cc (starts_with_ci): Don't assume the uppercase and lowercase letters are contiguous. (__floating_from_chars_hex): Likewise.
* libstdc++: Work around modules ICE in <charconv> [PR105297]Patrick Palka2022-04-211-1/+3
| | | | | | | | | | | | | | | | | | | | | This makes the initializer for __table in __from_chars_alnum_to_val dependent in an artificial way, which works around the reported modules testsuite ICE by preventing the compiler from evaluating the initializer parse time. Compared to the alternative workaround of using a non-local class type for __table, this workaround has the advantage of slightly speeding up compilation of <charconv>, since now the table won't get built (via constexpr evaluation) until the integer std::from_chars overload is instantiated. PR c++/105297 PR c++/105322 libstdc++-v3/ChangeLog: * include/std/charconv (__from_chars_alnum_to_val): Make initializer for __table dependent in an artificial way.
* libstdc++: Micro-optimize __from_chars_pow2_basePatrick Palka2022-04-181-8/+20
| | | | | | | | | | | | | | | | | | | | | | In the first iteration of __from_chars_pow2_base's main loop, we need to remember the value of the leading significant digit for sake of the overflow check at the end (for base > 2). This patch manually unrolls this first iteration so as to not encumber the entire loop with logic that only the first iteration needs. This seems to significantly improve performance: Base Before After (seconds, lower is better) 2 9.36 9.37 8 3.66 2.93 16 2.93 1.91 32 2.39 2.24 libstdc++-v3/ChangeLog: * include/std/charconv (__from_chars_pow2_base): Manually unroll the first iteration of the main loop and simplify accordingly.
* libstdc++: Avoid double-deref of __first in ranges::minmax [PR104858]Patrick Palka2022-04-151-1/+1
| | | | | | | | | | PR libstdc++/104858 libstdc++-v3/ChangeLog: * include/bits/ranges_algo.h (__minmax_fn): Avoid dereferencing __first twice at the start. * testsuite/25_algorithms/minmax/constrained.cc (test06): New test.
* libstdc++: Optimize integer std::from_charsPatrick Palka2022-04-151-147/+100
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This applies the following optimizations to the integer std::from_chars implementation: 1. Use a lookup table for converting an alphanumeric digit to its base-36 value instead of using a range test (for 0-9) and switch (for a-z and A-Z). The table is constructed using a C++14 constexpr function which doesn't assume a particular character encoding or __CHAR_BIT__ value. This new conversion function __from_chars_alnum_to_val is templated on whether we care only about the decimal digits, in which case we can perform the conversion with a single subtraction since the digit characters are guaranteed to be contiguous (unlike the letters). 2. Generalize __from_chars_binary to handle all power-of-two bases. This function (now named __from_chars_pow2_base) is also templated on whether we care only about the decimal digits for the benefit of faster digit conversion for base 2, 4 and 8. 3. In __from_chars_digit, use static_cast<unsigned char>(__c - '0') < __base instead of '0' <= __c && __c <= ('0' + (__base - 1)). as the digit recognition test (exhaustively verified that the two tests are equivalent). 4. In __from_chars_alnum, use a nested loop to consume the rest of the digits in the overflow case (mirroring __from_chars_digit) so that the main loop doesn't have to maintain the overflow flag __valid. At this point, __from_chars_digit is nearly identical to __from_chars_alnum, so this patch merges the two functions by removing the former and templatizing the latter according to whether we care only about the decimal digits. Finally, 5. In __from_chars_alnum, maintain a lower bound on the number of unused bits in the result and use it to omit the overflow check when it's safe to do so. In passing, this patch replaces the non-portable function ascii_to_hexit used by __floating_from_chars_hex with the new conversion function. Some runtime measurements for a simple 15-line benchmark that roundtrips printing/parsing 200 million integers via std::to/from_chars (average of 5 runs): Base Before After (seconds, lower is better) 2 9.37 9.37 3 15.79 12.13 8 4.15 3.67 10 4.90 3.86 11 6.84 5.03 16 4.14 2.93 32 3.85 2.39 36 5.22 3.26 libstdc++-v3/ChangeLog: * include/std/charconv (__from_chars_alnum_to_val_table): Define. (__from_chars_alnum_to_val): Define. (__from_chars_binary): Rename to ... (__from_chars_pow2_base): ... this. Generalize to handle any power-of-two base using __from_chars_alnum_to_val. (__from_chars_digit): Optimize digit recognition to a single test instead of two tests. Use [[__unlikely___]] attribute. (__from_chars_alpha_to_num): Remove. (__from_chars_alnum): Use __from_chars_alnum_to_val. Use a nested loop for the overflow case. Maintain a lower bound on the number of available bits in the result and use it to omit the overflow check. (from_chars): Adjust appropriately. * src/c++17/floating_from_chars.cc (ascii_to_hexit): Remove. (__floating_from_chars_hex): Use __from_chars_alnum_to_val to recognize a hex digit instead.
* libstdc++: Add new headers to <bits/stdc++.h> PCHJonathan Wakely2022-04-141-0/+4
| | | | | | | libstdc++-v3/ChangeLog: * include/precompiled/stdc++.h: Include <stacktrace> and <stdatomic.h> for C++23.
* libstdc++: Fix missing and incorrect feature test macros [PR105269]Jonathan Wakely2022-04-144-8/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | | libstdc++-v3/ChangeLog: PR libstdc++/105269 * include/bits/stl_vector.h (__cpp_lib_constexpr_vector): Define. * include/c_compatibility/stdatomic.h (__cpp_lib_stdatomic_h): Define. * include/std/optional (__cpp_lib_optional): Define new value for C++23. (__cpp_lib_monadic_optional): Remove. * include/std/version (__cpp_lib_constexpr_vector): Define. (__cpp_lib_stdatomic_h): Define. (__cpp_lib_optional): Define new value for C++23. (__cpp_lib_monadic_optional): Remove. * testsuite/20_util/optional/monadic/and_then.cc: Adjust. * testsuite/20_util/optional/requirements.cc: Adjust for C++23. * testsuite/20_util/optional/version.cc: Likewise. * testsuite/23_containers/vector/cons/constexpr.cc: Check feature test macro. * testsuite/29_atomics/headers/stdatomic.h/c_compat.cc: Likewise. * testsuite/20_util/optional/monadic/version.cc: Removed. * testsuite/23_containers/vector/requirements/version.cc: New test. * testsuite/29_atomics/headers/stdatomic.h/version.cc: New test.
* libstdc++: shrink-to-fit in std::basic_stacktrace::current(skip, max)Jonathan Wakely2022-04-121-1/+14
| | | | | | | | | | | If a large stacktrace is reduced to a max depth that is less than half the capacity it will now be reallocated to remove the unused capacity. libstdc++-v3/ChangeLog: * include/std/stacktrace (basic_stacktrace::current): Reallocate a smaller container if the unused capacity is larger than the used size.
* libstdc++: Use allocator to construct std::stacktrace_entry objectsJonathan Wakely2022-04-121-45/+47
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Because std::basic_stacktrace<A> is an allocator-aware container its elements should be initialized using allocator_traits<A>::construct and destroyed using allocator_traits<A>::destroy. This adds new _M_clone and _M_assign helper functions to construct elements correctly and uses those functions instead of calling std::uninitialized_copy_n. The _Impl::_M_destroy function needs to be passed an allocator to destroy the elements correctly, so is replaced by _M_resize which can also be used to trim the container to a smaller size. Because destroying and creating std::stacktrace_entry objects is cheap, the copy/move assignment operators can just destroy all existing elements and use _Impl._M_clone or _Impl._M_assign to create new ones. libstdc++-v3/ChangeLog: * include/std/stacktrace (basic_stacktrace): Use _Impl::_M_clone or _Impl::_M_assign to initialize elements in allocated storage. (basic_stacktrace::_M_clear()): Use _Impl::_M_resize instead of _Impl::_M_destroy. (basic_stacktrace::_Impl::_M_destroy()): Replace with ... (basic_stacktrace::_Impl::_M_resize(size_type, allocator&)): New function. (basic_stacktrace::_Impl::_M_push_back): Use _M_xclone. Construct new element using allocator. (basic_stacktrace::_Impl::_M_clone): New function. (basic_stacktrace::_Impl::_M_xclone): New function. (basic_stacktrace::_Impl::_M_assign): New function.
* libstdc++: Use nothrow new in std::stacktraceJonathan Wakely2022-04-121-7/+35
| | | | | | | | | | | | | We can avoid the overhead of handling a bad_alloc exception from std::allocator<std::stacktrace_entry>::allocate by just calling the nothrow operator new instead. libstdc++-v3/ChangeLog: * include/std/stacktrace (basic_stacktrace::_Impl::_M_allocate): Use nothrow new instead of try block for std::allocator. (basic_stacktrace::_Impl::_M_deallocate): Use delete for std::allocator.
* libstdc++: Reduce memory usage in std::stacktrace::currentJonathan Wakely2022-04-121-48/+62
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This adds an alternative callback for use in the overload of basic_stacktrace::current that takes a max_depth parameter. The new callback will not allow the container to grow past the initial capacity, which is set to the specified maximum depth. This avoids allocating memory for hundreds of frames only to discard them again because of a small maximum depth limit. For larger maximum depths the normal callback is used, with a smaller initial capacity that can grow as needed. The container will be resized to the given max depth after the entire backtrace has been produced (relying on the fact that std::stacktrace_entry objects are trivially destructible to elide their destruction). Currently the value for "larger" limits is 128, so a max depth <= 128 will allocate capacity for exactly that many frames. A larger max depth (or an unspecified max depth) will use an initial capacity of 64 frames and grow as needed. Since each frame is only a uintptr_t value it might be reasonable to increase the first value so that memory usage can be capped for larger maximum depths. This change also delays the creation of the libbacktrace state until we actually need it, so that the state is not created if allocation fails. libstdc++-v3/ChangeLog: * include/std/stacktrace (basic_stacktrace::current): Replace calls to _M_reserve and _S_curr_cb with call to _M_prepare. Check return value of backtrace_simple when max depth given. (basic_stacktrace::_M_reserve): Remove. (basic_stacktrace::_S_curr_cb): Remove. (basic_stacktrace::_M_prepare(size_type)): New function to reserve initial capacity and return callback. (basic_stacktrace::_Impl::_M_allocate): Remove check for 0 < n and remove redundant zeroing of _M_frames and _M_capacity. (basic_stacktrace::_Impl::_M_push_back): Add [[unlikely]] attribute. Assign _Impl instead of swapping. * testsuite/19_diagnostics/stacktrace/current.cc: New test.
* libstdc++: Fix incorrect branch prediction hint in std::stacktraceJonathan Wakely2022-04-111-1/+1
| | | | | | | libstdc++-v3/ChangeLog: * include/std/stacktrace (basic_stacktrace::_Impl::_M_allocate): Change [[unlikely]] attribute to [[likely]].
* libstdc++: Fix std::basic_stacktrace special members [PR105031]Jonathan Wakely2022-04-111-22/+37
| | | | | | | | | | | | | | | | | | | | | The PR points out that there is a non-constant condition used for an if-constexpr statement, but there are several other problems with the copy, move and swap members of std::basic_stacktrace. libstdc++-v3/ChangeLog: PR libstdc++/105031 * include/std/stacktrace (basic_stacktrace::basic_stacktrace): Fix allocator usage in constructors. (basic_stacktrace::operator=(const basic_stacktrace&)): Do not try to reallocate using const allocator. (basic_stacktrace::operator=(basic_stacktrace&&)): Fix if-constexpr with non-constant condition. Do not allocate new storage if allocator propagates. Do not set _M_size if allocation fails. (basic_stacktrace::swap(basic_stacktrace&)): Fix typo. Add assertion that non-propagating allocators are equal. * testsuite/19_diagnostics/stacktrace/stacktrace.cc: New test.
* libstdc++: Improve behaviour of std::stacktrace::currentJonathan Wakely2022-04-111-22/+69
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | This prevents inlining the current() function to guarantee that it is present in the stacktrace, then tells libbacktrace to skip that frame. To avoid overflow in the int argument to __glibcxx_backtrace_simple, we need to check if the skip parameter exceeds INT_MAX (which is possible for 16-bit targets where short and int have the same width). We also need to limit the size of the returned value to the max_depth parameter, which was missing previously. This also fixes basic_stacktrace::max_size() to not exceed the maximum size supported by the allocator, which might be smaller than the maximum value of size_type. libstdc++-v3/ChangeLog: * include/std/stacktrace (basic_stacktrace::current): Duplicate implementation into each overload. Add noinline attribute and skip current frame. (basic_stacktrace::max_size()): Call _Impl::_S_max_size. (basic_stacktrace::_S_curr_cb()): New function defining lambda. (basic_stacktrace::_Impl::_S_max_size): New function defining maximum size in terms of allocator and size_type. (basic_stacktrace::_Impl::_M_allocate): Check against max_size(). * testsuite/19_diagnostics/stacktrace/entry.cc: Call function for non-constexpr checks. Check line number is correct.
* libstdc++: Move Filesystem TS path definitions out of class bodyJonathan Wakely2022-04-111-21/+38
| | | | | | | | | | This fixes some errors with clang caused by instantiating vector<_Cmpt> before the _Cmpt type is complete. libstdc++-v3/ChangeLog: * include/experimental/bits/fs_path.h (path): Define special members after path::_Cmpt is complete.
* libstdc++: Fix constraints on std::expected<void, E> constructor [PR105153]Jonathan Wakely2022-04-081-2/+2
| | | | | | | | | libstdc++-v3/ChangeLog: PR libstdc++/105153 * include/std/expected (expected<void,E>::expected(expected<U,G>&&)): Fix constraints. * testsuite/20_util/expected/cons.cc: Check constructor.
* libstdc++: Fix std::expected<void, E>::swap(expected&) [PR105154]Jonathan Wakely2022-04-081-0/+2
| | | | | | | | | | libstdc++-v3/ChangeLog: PR libstdc++/105154 * include/std/expected (expected<void, E>::swap): Set _M_has_value to false for objects that previously had a value. * testsuite/20_util/expected/swap.cc: Fix test to check void specialization.
* libstdc++: Fix std::bad_expected_access constructor [PR105146]Jonathan Wakely2022-04-081-1/+1
| | | | | | | | | libstdc++-v3/ChangeLog: PR libstdc++/105146 * include/std/expected (bad_expected_access): Move constructor parameter. * testsuite/20_util/expected/bad.cc: New test.
* libstdc++: Tweak source_location for clang trunk [PR105128]Jakub Jelinek2022-04-021-8/+7
| | | | | | | | | | | | | | | | | | | | | Apparently clang trunk implemented __builtin_source_location(), but the using __builtin_ret_type = decltype(__builtin_source_location()); which has been added for it isn't enough, they also need the std::source_location::__impl class to be defined (but incomplete seems to be good enough) before the builtin is used. The following has been tested on godbolt with clang trunk (old version fails with error: 'std::source_location::__impl' was not found; it must be defined before '__builtin_source_location' is called and some follow-up errors), getting back to just void * instead of __builtin_ret_type and commenting out using doesn't work either and just struct __impl; before using __builtin_ret_type doesn't work too. 2022-04-02 Jakub Jelinek <jakub@redhat.com> PR libstdc++/105128 * include/std/source_location (std::source_location::__impl): Move definition before using __builtin_ret_type.
* libstdc++: Implement std::unreachable() for C++23 (P0627R6)Jonathan Wakely2022-04-012-0/+27
| | | | | | | | | | | | | | | | | | | | | | | | | | | This defines std::unreachable as an assertion for debug mode, a trap when _GLIBCXX_ASSERTIONS is defined, and __builtin_unreachable() otherwise. The reason for only using __builtin_trap() in the second case is to avoid the overhead of setting up a call to __glibcxx_assert_fail that should never happen. UBsan can detect if __builtin_unreachable() is executed, so if a feature test macro for that sanitizer is added, we could change just use __builtin_unreachable() when the sanitizer is enabled. While thinking about what the debug assertion failure should print, I noticed that the __glibcxx_assert_fail function doesn't check for null pointers. This adds a check so we don't try to print them if null. libstdc++-v3/ChangeLog: * include/std/utility (unreachable): Define for C++23. * include/std/version (__cpp_lib_unreachable): Define. * src/c++11/debug.cc (__glibcxx_assert_fail): Check for valid arguments. Handle only the function being given. * testsuite/20_util/unreachable/1.cc: New test. * testsuite/20_util/unreachable/version.cc: New test.
* libstdc++: Fix mismatched noexcept-specifiers in Filesystem TSJonathan Wakely2022-04-012-3/+3
| | | | | | | | | | | | | | The copy_file fix should have been part of r12-7063-gda72e0fd20f87b. The path::begin() fix should have been part of r12-3930-gf2b7f56a15d9cb. Thanks to Timm Bäder for reporting this one. libstdc++-v3/ChangeLog: * include/experimental/bits/fs_fwd.h (copy_file): Remove incorrect noexcept from declaration. * include/experimental/bits/fs_path.h (path::begin, path::end): Add noexcept to declarations, to match definitions.
* libstdc++: Fix filenames in Doxygen @file commentsTimm Bäder2022-04-012-2/+2
| | | | | | | | | Reviewed-by: Jonathan Wakely <jwakely@redhat.com> libstdc++-v3/ChangeLog: * include/bits/fs_ops.h: Fix filename in Doxygen comment. * include/experimental/bits/fs_ops.h: Likewise.
* libstdc++: Fix incorrect preprocessor conditions in <version>Jonathan Wakely2022-03-291-3/+5
| | | | | | | | | | | | | | | The conditions that guard the feature test macros in <version> should match the main definitions of the macros in other headers. This doesn't matter for GCC, because it supports all the conditions being tested here, but it does matter for non-GCC compilers without the relevant C++20 features. libstdc++-v3/ChangeLog: * include/std/version (__cpp_lib_variant): Fix conditions to match <variant>. (__cpp_lib_expected): Fix condition to match <expected>.
* libstdc++: Define std::expected for C++23 (P0323R12)Jonathan Wakely2022-03-275-0/+1244
| | | | | | | | | | | | | | | | | | | | | | | | | | Because this adds a new class template called std::unexpected, we have to stop declaring the std::unexpected() function (which was deprecated in C++11 and removed in C++17). libstdc++-v3/ChangeLog: * doc/doxygen/user.cfg.in: Add new header. * include/Makefile.am: Likewise. * include/Makefile.in: Regenerate. * include/precompiled/stdc++.h: Add new header. * include/std/version (__cpp_lib_expected): Define. * libsupc++/exception [__cplusplus > 202002] (unexpected) (unexpected_handler, set_unexpected): Do not declare for C++23. * include/std/expected: New file. * testsuite/20_util/expected/assign.cc: New test. * testsuite/20_util/expected/cons.cc: New test. * testsuite/20_util/expected/illformed_neg.cc: New test. * testsuite/20_util/expected/observers.cc: New test. * testsuite/20_util/expected/requirements.cc: New test. * testsuite/20_util/expected/swap.cc: New test. * testsuite/20_util/expected/synopsis.cc: New test. * testsuite/20_util/expected/unexpected.cc: New test. * testsuite/20_util/expected/version.cc: New test.
* libstdc++: Add more doxygen comments in <bit>Jonathan Wakely2022-03-251-1/+19
| | | | | | | libstdc++-v3/ChangeLog: * include/std/bit (bit_cast, byteswap, endian): Add doxygen comments.
* libstdc++: Add missing constraints to std::bit_cast [PR105027]Jonathan Wakely2022-03-231-0/+4
| | | | | | | | | | | | | | | | | Our std::bit_cast was relying on the compiler to check for errors inside __builtin_bit_cast, instead of checking them as constraints. That means std::bit_cast was not SFINAE-friendly. This fix uses a requires-clause, so for old versions of Clang without concepts support the function will still be unconstrained. At some point in future we can remove the #ifdef __cpp_concepts check and rely on all compilers having full concepts support in C++20 mode. libstdc++-v3/ChangeLog: PR libstdc++/105027 * include/std/bit (bit_cast): Add constraints. * testsuite/26_numerics/bit/bit.cast/105027.cc: New test.
* libstdc++: Fix feature test macros in <version> for freestandingJonathan Wakely2022-03-231-16/+19
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Some C++17 and C++20 feature test macros are only defined in <version> for hosted builds, even though the features are supported for freestanding. All C++23 feature test macros are defined in <version> for freestanding, but most of the features are only supported for hosted. libstdc++-v3/ChangeLog: * include/std/version [!_GLIBCXX_HOSTED] (__cpp_lib_hardware_interference_size): Define for freestanding. (__cpp_lib_bit_cast): Likewise. (__cpp_lib_is_layout_compatible): Likewise. (__cpp_lib_is_pointer_interconvertible): Likewise. (__cpp_lib_adaptor_iterator_pair_constructor): Do not define for freestanding. (__cpp_lib_invoke_r): Likewise. (__cpp_lib_ios_noreplace): Likewise. (__cpp_lib_monadic_optional): Likewise. (__cpp_lib_move_only_function): Likewise. (__cpp_lib_spanstream): Likewise. (__cpp_lib_stacktrace): Likewise. (__cpp_lib_string_contains): Likewise. (__cpp_lib_string_resize_and_overwrite): Likewise. (__cpp_lib_to_underlying): Likewise.
* libstdc++: Disable atomic wait for freestanding [PR105021]Jonathan Wakely2022-03-231-1/+1
| | | | | | | | | | | | | | | We use either condition variables or futexes to implement atomic waits, so we can't do it in freestanding. This is non-conforming, so should be revisited later, probably by making freestanding atomic waiting operations spin without ever blocking. Reviewed-by: Thomas Rodgers <trodgers@redhat.com> libstdc++-v3/ChangeLog: PR libstdc++/105021 * include/bits/atomic_base.h [!_GLIBCXX_HOSTED]: Do not include <bits/atomic_wait.h> for freestanding.
* libstdc++: Work around clang misdesign in time_get<>::get [PR104990]Jakub Jelinek2022-03-211-1/+1
| | | | | | | | | | | | | | | Apparently clang has a -fgnuc-version= option which allows it to pretend it is any GCC version the user likes. It is already bad that it claims to be GCC 4.2 compatible by default when it is not (various unimplemented extensions at least), but this option is a horrible idea. Anyway, this patch adds a hack for it. 2022-03-21 Jakub Jelinek <jakub@redhat.com> PR libstdc++/104990 * include/bits/locale_facets_nonio.tcc (get): Don't check if do_get isn't overloaded if __clang__ is defined.
* libstdc++: Simplify constraints for std::any construction [PR104242]Jonathan Wakely2022-03-181-2/+2
| | | | | | | | | | | | | | | | | | Partially revert r12-4190-g6da36b7d0e43b6f9281c65c19a025d4888a25b2d because using __and_<..., is_copy_constructible<T>> when T is incomplete results in an error about deriving from is_copy_constructible<T> when that is incomplete. I don't know how to fix that, so this simply restores the previous constraint which worked in this case (even though I think it's technically undefined to use is_copy_constructible<T> with incomplete T). This doesn't restore exactly what we had before, but uses the is_copy_constructible_v and __is_in_place_type_v variable templates instead of the ::value member. libstdc++-v3/ChangeLog: PR libstdc++/104242 * include/std/any (any(T&&)): Revert change to constraints. * testsuite/20_util/any/cons/104242.cc: New test.
* libstdc++: Reduce header dependencies from PSTL headers [PR92546]Jonathan Wakely2022-03-182-3/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This avoids including the whole of <functional> in <algorithm>, as the <pstl/glue_algorithm_defs.h> header only actually needs std::pair. This also avoids including <iterator> in <pstl/utils.h>, which only needs <type_traits>, std::bad_alloc, and std::terminate (which can be repalced with std::__terminate). This matters less, because <pstl/utils.h> is only included by the <pstl/*_impl.h> headers and they all use <iterator> anyway, and are only included by <execution>. libstdc++-v3/ChangeLog: PR libstdc++/92546 * include/pstl/glue_algorithm_defs.h: Replace <functional> with <bits/stl_pair.h>. * include/pstl/utils.h: Replace <iterator> with <type_traits>. (__pstl::__internal::__except_handler): Use std::__terminate instead of std::terminate. * src/c++17/fs_path.cc: Include <array>. * testsuite/25_algorithms/adjacent_find/constexpr.cc: Include <functional>. * testsuite/25_algorithms/binary_search/constexpr.cc: Likewise. * testsuite/25_algorithms/clamp/constrained.cc: Likewise. * testsuite/25_algorithms/equal/constrained.cc: Likewise. * testsuite/25_algorithms/for_each/constrained.cc: Likewise. * testsuite/25_algorithms/includes/constrained.cc: Likewise. * testsuite/25_algorithms/is_heap/constexpr.cc: Likewise. * testsuite/25_algorithms/is_heap_until/constexpr.cc: Likewise. * testsuite/25_algorithms/is_permutation/constrained.cc: Include <iterator>. * testsuite/25_algorithms/is_sorted/constexpr.cc: Include <functional>. * testsuite/25_algorithms/is_sorted_until/constexpr.cc: Likewise. * testsuite/25_algorithms/lexicographical_compare/constexpr.cc: Likewise. * testsuite/25_algorithms/lexicographical_compare/constrained.cc: Likewise. * testsuite/25_algorithms/lexicographical_compare_three_way/1.cc: Include <array>. * testsuite/25_algorithms/lower_bound/constexpr.cc: Include <functional>. * testsuite/25_algorithms/max/constrained.cc: Likewise. * testsuite/25_algorithms/max_element/constrained.cc: Likewise. * testsuite/25_algorithms/min/constrained.cc: Likewise. * testsuite/25_algorithms/min_element/constrained.cc: Likewise. * testsuite/25_algorithms/minmax_element/constrained.cc: Likewise. * testsuite/25_algorithms/mismatch/constexpr.cc: Likewise. * testsuite/25_algorithms/move/93872.cc: Likewise. * testsuite/25_algorithms/move_backward/93872.cc: Include <iterator>. * testsuite/25_algorithms/nth_element/constexpr.cc: Include <functional>. * testsuite/25_algorithms/partial_sort/constexpr.cc: Likewise. * testsuite/25_algorithms/partial_sort_copy/constexpr.cc: Likewise. * testsuite/25_algorithms/search/constexpr.cc: Likewise. * testsuite/25_algorithms/search_n/constrained.cc: Likewise. * testsuite/25_algorithms/set_difference/constexpr.cc: Likewise. * testsuite/25_algorithms/set_difference/constrained.cc: Likewise. * testsuite/25_algorithms/set_intersection/constexpr.cc: Likewise. * testsuite/25_algorithms/set_intersection/constrained.cc: Likewise. * testsuite/25_algorithms/set_symmetric_difference/constexpr.cc: Likewise. * testsuite/25_algorithms/set_union/constexpr.cc: Likewise. * testsuite/25_algorithms/set_union/constrained.cc: Likewise. * testsuite/25_algorithms/sort/constexpr.cc: Likewise. * testsuite/25_algorithms/sort_heap/constexpr.cc: Likewise. * testsuite/25_algorithms/transform/constrained.cc: Likewise. * testsuite/25_algorithms/unique/constexpr.cc: Likewise. * testsuite/25_algorithms/unique/constrained.cc: Likewise. * testsuite/25_algorithms/unique_copy/constexpr.cc: Likewise. * testsuite/25_algorithms/upper_bound/constexpr.cc: Likewise. * testsuite/std/ranges/adaptors/elements.cc: Include <vector>. * testsuite/std/ranges/adaptors/lazy_split.cc: Likewise. * testsuite/std/ranges/adaptors/split.cc: Likewise.
* libstdc++: Avoid including <algorithm> in <filesystem> [PR92546]Jonathan Wakely2022-03-171-3/+6
| | | | | | | | | | | This only affects Windows, but reduces the preprocessed size of <filesystem> significantly. libstdc++-v3/ChangeLog: PR libstdc++/92546 * include/bits/fs_path.h (path::make_preferred): Use handwritten loop instead of std::replace.
* libstdc++: Rewrite __moneypunct_cache::_M_cache [PR104966]Jonathan Wakely2022-03-171-51/+51
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | GCC thinks the following can lead to a buffer overflow when __ns.size() equals zero: const basic_string<_CharT>& __ns = __mp.negative_sign(); _M_negative_sign_size = __ns.size(); __negative_sign = new _CharT[_M_negative_sign_size]; __ns.copy(__negative_sign, _M_negative_sign_size); This happens because operator new might be replaced with something that writes to this->_M_negative_sign_size and so the basic_string::copy call could use a non-zero size to write to a zero-length buffer. The solution suggested by Richi is to cache the size in a local variable so that the compiler knows it won't be changed between the allocation and the copy. This commit goes further and rewrites the whole function to use RAII and delay all modifications of *this until after all allocations have succeeded. The RAII helper type caches the size and copies the string and owns the memory until told to release it. libstdc++-v3/ChangeLog: PR middle-end/104966 * include/bits/locale_facets_nonio.tcc (__moneypunct_cache::_M_cache): Replace try-catch with RAII and make all string copies before any stores to *this.
* libstdc++: Ensure that std::from_chars is declared when supportedJonathan Wakely2022-03-162-5/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This adjusts the declarations in <charconv> to match when the definition is present. This solves the issue that std::from_chars is present on Solaris 11.3 (using fast_float) but was not declared in the header (because the declarations were guarded by _GLIBCXX_HAVE_USELOCALE). Additionally, do not define __cpp_lib_to_chars unless both from_chars and to_chars are supported (which is only true for IEEE float and double). We might still provide from_chars (via strtold) but if to_chars isn't provided, we shouldn't define the feature test macro. Finally, this simplifies some of the preprocessor checks in the bodies of std::from_chars in src/c++17/floating_from_chars.cc and hoists the repeated code for the strtod version into a new function template. N.B. the long double overload of std::from_chars will always be defined if the float and double overloads are defined. We can always use one of strtold or fast_float's binary64 routines (although the latter might produce errors for some long double values if they are not representable as binary64). libstdc++-v3/ChangeLog: * include/std/charconv (__cpp_lib_to_chars): Only define when both from_chars and to_chars are supported for floating-point types. (from_chars, to_chars): Adjust preprocessor conditions guarding declarations. * include/std/version (__cpp_lib_to_chars): Adjust condition to match <charconv> definition. * src/c++17/floating_from_chars.cc (from_chars_strtod): New function template. (from_chars): Simplify preprocessor checks and use from_chars_strtod when appropriate.
* libstdc++: Move closing brace outside #endif [PR104866]Detlef Vollmann2022-03-101-1/+1
| | | | | | | | libstdc++-v3/ChangeLog: PR libstdc++/104866 * include/bits/this_thread_sleep.h: Fix order of #endif and closing brace of namespace.
* libstdc++: Remove incorrect copyright notice from headerJonathan Wakely2022-03-081-14/+0
| | | | | | | | | | | | | This file has the SGI copyright notice, but contains no code from the SGI STL. It was entirely written by me in 2019, originally as part of the <memory> header. When I extracted it into a new header I accidentally copied across the SGI copyright, but that only applies to some much older parts of <memory>. libstdc++-v3/ChangeLog: * include/bits/uses_allocator_args.h: Remove incorrect copyright notice.
* libstdc++: Use visibility pragmas instead of attributes [PR104807]Jonathan Wakely2022-03-071-2/+7
| | | | | | | | | | | | | | The _GLIBCXX_PSEUDO_VISIBILITY macro isn't defined until after including os_defines.h, so we can't use _GLIBCXX_VISIBILITY early in c++config. Replace the uses of that macro with #pragma visibility push(default) instead. libstdc++-v3/ChangeLog: PR libstdc++/104807 * include/bits/c++config (__terminate, __glibcxx_assert_fail): Replace _GLIBCXX_VISIBILITY on function with visibility pragma. (__is_constant_evaluated): Add visibility pragma.
* libstdc++: Ensure __glibcxx_assert_fail has default visibilityJonathan Wakely2022-03-051-1/+2
| | | | | | | | | | | | | | This ensures there's no linker error if libstdc++ headers are included following a pragma that sets hidden visibility. Similarly for std::__terminate, which is always-inline so shouldn't matter, but it's not wrong to do this anyway. libstdc++-v3/ChangeLog: * include/bits/c++config (__glibcxx_assert_fail): Add visibility attribute. (__terminate): Likewise.
* libstdc++: Fix -Wmaybe-uninitialized false positive [PR103984]Jonathan Wakely2022-03-011-1/+1
| | | | | | | | | | | | | | | This fixes a false positive warning seen with LTO: 12/bits/regex_compiler.tcc:443:32: error: '__last_char._M_char' may be used uninitialized [-Werror=maybe-uninitialized] Given that the std::regex code is not very efficient anyway, the overhead of initializing this byte should be minimal. libstdc++-v3/ChangeLog: PR middle-end/103984 * include/bits/regex_compiler.h (_BracketMatcher::_M_char): Use default member initializer.
* libstdc++: Fix cast in source_location::current() [PR104602]Jonathan Wakely2022-02-241-1/+2
| | | | | | | | | | | | | | | This fixes a problem for Clang, which is going to return a non-void pointer from __builtin_source_location(). The current definition of std::source_location::current() converts that to void* and then has to cast it back again in the body (which makes it invalid in a constant expression). By using the actual type of the returned pointer, we avoid the problematic cast for Clang. libstdc++-v3/ChangeLog: PR libstdc++/104602 * include/std/source_location (source_location::current): Use deduced type of __builtin_source_location().
* libstdc++: Implement P2415R2 changes to viewable_range / views::allPatrick Palka2022-02-224-8/+101
| | | | | | | | | | | | | | | | | | | | | | | | | | This implements the wording changes in P2415R2 "What is a view?", which is a DR for C++20. libstdc++-v3/ChangeLog: * include/bits/ranges_base.h (__detail::__is_initializer_list): Define. (viewable_range): Adjust as per P2415R2. * include/bits/ranges_cmp.h (__cpp_lib_ranges): Adjust value. * include/std/ranges (owning_view): Define as per P2415R2. (enable_borrowed_range<owning_view>): Likewise. (views::__detail::__can_subrange): Replace with ... (views::__detail::__can_owning_view): ... this. (views::_All::_S_noexcept): Sync with operator(). (views::_All::operator()): Use owning_view instead of subrange as per P2415R2. * include/std/version (__cpp_lib_ranges): Adjust value. * testsuite/std/ranges/adaptors/all.cc (test06): Adjust now that views::all uses owning_view instead of subrange. (test08): New test. * testsuite/std/ranges/adaptors/lazy_split.cc (test09): Adjust now that rvalue non-view non-borrowed ranges are viewable. * testsuite/std/ranges/adaptors/split.cc (test06): Likewise.
* libstdc++: Deprecate non-standard std::vector<bool>::insert(pos) [PR104559]Jonathan Wakely2022-02-171-2/+9
| | | | | | | | | | | | | | | | | | | | | | | The SGI STL and pre-1998 drafts of the C++ standard had a default argument for vector<bool>::insert(iterator, const bool&) which was remove by N1051. The default argument is still present in libstdc++ for some reason. There are no tests verifying it as an extension, so I don't think it has been kept intentionally. This removes the default argument but adds an overload without the second parameter, and adds the deprecated attribute to it. This allows any code using it to keep working (for now) but with a warning. libstdc++-v3/ChangeLog: PR libstdc++/104559 * doc/xml/manual/evolution.xml: Document deprecation. * doc/html/manual/api.html: Regenerate. * include/bits/stl_bvector.h (insert(const_iterator, const bool&)): Remove default argument. (insert(const_iterator)): New overload with deprecated attribute. * testsuite/23_containers/vector/bool/modifiers/insert/104559.cc: New test.
* libstdc++: Add missing constexpr to uses-allocator construction utilities ↵Jonathan Wakely2022-02-151-2/+2
| | | | | | | | | | | | [PR104542] libstdc++-v3/ChangeLog: PR libstdc++/104542 * include/bits/uses_allocator_args.h (make_obj_using_allocator) (uninitialized_construct_using_allocator): Add constexpr. * testsuite/20_util/uses_allocator/make_obj.cc: Check constexpr. * testsuite/20_util/uses_allocator/uninitialized_construct.cc: New test.
* libstdc++: Fix stream extraction of IEEE128 long double [PR100912]Jonathan Wakely2022-02-141-13/+10
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The std::__convert_from_v helper that formats double and long double values into a char buffer was not being duplicated for the two long double ABIs. This resulted in an ODR violation inside the library, where some callers needed it to use snprintf to format __ibm128 values and other callers needed it to use __snprintfieee128 to format __ieee128 values. The linker discarded one of the definitions, leaving one set of callers using the wrong code. This puts __convert_from_v in the __gnu_cxx_ieee128 inline namespace when long double is __ieee128, so that there are two different definitions of the function. The std::money_put::__do_put overload for __ibm128 values needs a different fix, because that is defined when long double is __ieee128 and so would call the one in the inline namespace. That can be fixed by just inlining the code directly into the function and using an asm alias to call the right version of snprintf for the __ibm128 format. The code to do that can be simpler than __convert_from_v because if we're defining the ALT128_COMPAT symbols we know that we have a recent glibc and so we can assume that uselocale and snprintf are supported. libstdc++-v3/ChangeLog: PR libstdc++/100912 * config/locale/gnu/c_locale.h (__convert_from_v): Use inline namespace for IEEE128 long double mode. * config/os/gnu-linux/ldbl-ieee128-extra.ver: Add new symbol version and export __gnu_cxx_ieee128::__convert_from_v. * include/bits/locale_facets_nonio.tcc (money_put::__do_put): Make __ibm128 overload use snprintf directly * testsuite/util/testsuite_abi.cc: Add new symbol version. Remove stable IEEE128/LDBL versions.
* libstdc++: Use __cpp_concepts instead of custom macro [PR103891]Jonathan Wakely2022-02-143-15/+8
| | | | | | | | | | | | | | | | | With the new value of __cpp_concepts required by P2493, we can test whether the compiler supports conditionally trivial special members. This allows us to remove the workaround that disables fully-constexpr std::variant for Clang. Now it should work for non-GCC compilers (such as future releases of Clang) that support conditionally trivial destructors and define the new value of __cpp_concepts. libstdc++-v3/ChangeLog: PR libstdc++/103891 * include/bits/c++config (_GLIBCXX_HAVE_COND_TRIVIAL_SPECIAL_MEMBERS): Remove. * include/std/variant: Check feature test macros instead. * include/std/version: Likewise.