aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/include
AgeCommit message (Collapse)AuthorFilesLines
2024-07-25libstdc++: Implement P2968R2 "Making std::ignore a first-class object"Jonathan Wakely2-31/+29
This was recently approved for C++26, but we can apply the changes for all modes back to C++11. There's no reason not to make the assignment usable in constant expressions for C++11 mode, and noexcept for all modes. Move the definitions to <bits/utility.h> so they're available in <utility> as well as <tuple>. libstdc++-v3/ChangeLog: * include/bits/utility.h (_Swallow_assign): Make assignment constexpr for C++11 as well, and add noexcept. * include/std/tuple (_Swallow_assign, ignore): Move to bits/utility.h. * testsuite/20_util/headers/utility/ignore.cc: New test.
2024-07-25libstdc++: Reorder template params of std::optional comparisons (LWG 2945)Jonathan Wakely1-18/+18
libstdc++-v3/ChangeLog: * include/std/optional: Reorder parameters in comparison operators as per LWG 2945.
2024-07-25libstdc++: fix uses of explicit object parameter [PR116038]Patrick Palka2-6/+9
The type of an implicit object parameter is always the current class. For an explicit object parameter however, its deduced type can be a derived class of the current class. So when combining multiple implicit-object overloads into a single explicit-object overload we need to account for this possibility. For example when accessing a member of the current class through an explicit object parameter, it may now be a derived class from which the member is not accessible, as in the below testcases. This pitfall is discussed[1] in the deducing this paper. The general solution is to cast the explicit object parameter to (a reference to) the current class rather than e.g. using std::forward which preserves the deduced type. This patch corrects the existing problematic uses of explicit object parameters in the library, all of which forward the parameter via std::forward, to instead cast the parameter to the current class via our __like_t alias template. Note that unlike the paper's like_t, ours always returns a reference so we can just write __like_t<Self, B>(self) instead of (_like_t<Self, B>&&)self as the paper does. [1]: https://wg21.link/P0847#name-lookup-within-member-functions (and the section after that) PR libstdc++/116038 libstdc++-v3/ChangeLog: * include/std/functional (_Bind_front::operator()): Use __like_t instead of std::forward when forwarding __self. (_Bind_back::operator()): Likewise. * include/std/ranges (_Partial::operator()): Likewise. (_Pipe::operator()): Likewise. * testsuite/20_util/function_objects/bind_back/116038.cc: New test. * testsuite/20_util/function_objects/bind_front/116038.cc: New test. * testsuite/std/ranges/adaptors/116038.cc: New test. Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
2024-07-25libstdc++: Add noexcept to bad_expected_access<void> members (LWG 4031)Jonathan Wakely1-4/+4
libstdc++-v3/ChangeLog: * include/std/expected (bad_expected_access<void>): Add noexcept to special member functions, as per LWG 4031. * testsuite/20_util/expected/bad.cc: Check for nothrow copy and move members.
2024-07-25libstdc++: Use concepts and conditional explicit in std::optionalJonathan Wakely1-9/+121
For C++20 mode we can improve compile times by using conditional explicit to reduce the number of constructor overloads. We can also use requires-clauses instead of SFINAE to implement constraints on the constructors and assignment operators. libstdc++-v3/ChangeLog: * include/std/optional (optional): Use C++20 features to simplify overload sets for constructors and assignment operators.
2024-07-25libstdc++: Implement LWG 3836 for std::optional bool conversionsJonathan Wakely1-16/+42
libstdc++-v3/ChangeLog: * include/std/optional (optional): Constrain constructors to prevent problematic bool conversions, as per LWG 3836. * testsuite/20_util/optional/cons/lwg3836.cc: New test.
2024-07-25libstdc++: Implement LWG 3836 for std::expected bool conversionsJonathan Wakely1-16/+43
libstdc++-v3/ChangeLog: * include/std/expected (expected): Constrain constructors to prevent problematic bool conversions, as per LWG 3836. * testsuite/20_util/expected/lwg3836.cc: New test.
2024-07-25libstdc++: Use concepts to simplify std::optional base classesJonathan Wakely1-45/+121
In C++20 mode we can simplify some of the std::optional base class hierarchy using concepts. We can overload the destructor and copy constructor and move constructor with a trivial defaulted version and a constrained non-trivial version. This allows us to remove some class template partial specializations that were used to conditionally define those special members as trivial or non-trivial. This should not change any semantics, but should be less work for the compiler, due to not needing to match partial specializations, and completely removing one level of the inheritance hierarchy. libstdc++-v3/ChangeLog: * include/std/optional (_Optional_payload_base::_Storage) [C++20]: Define constrained non-trivial destructor. (_Optional_payload_base::_Storage<U, false>) [C++20]: Do not define partial specialization when primary template has constrained destructor. (_Optional_base) [C++20]: Define constrained trivial copy and move cons and move constructors. Define payload accessors here instead of inheriting them from _Optional_base_impl. (_Optional_base_impl, _Optional_base<T, false, true>) (_Optional_base<T, true, false>, _Optional_base<T, true, true>) [C++20]: Do not define.
2024-07-25libstdc++: Use _M_get() in std::optional internalsJonathan Wakely1-18/+20
Now that _base::_M_get() doesn't check the precondition, we can use _M_get() instead of operator*() for the internal uses where we've already checked the precondition holds. Add a using-declaration so that we don't need to lookup _M_get in the dependent base class, and make optional<U> a friend so that the converting constructors and assignment operators can use the parameter's _M_get member. libstdc++-v3/ChangeLog: * include/std/optional (optional): Add using-declaraction for _Base::_M_get and declare optional<U> as friend. (optional(const optional<U>&)): Use _M_get instead of operator*. (optional(optional<U>&&)): Likewise. (operator=(const optional<U>&)): Likewise. (operator=(optional<U>&&)): Likewise. (and_then, tansform): Likewise.
2024-07-25libstdc++: Move std::optional assertions out of _M_get()Jonathan Wakely1-14/+26
Currently we implement the precondition for accessing the contained value of a std::optional in the _M_get() accessor in the base class. This means that we always check the assertions even in internal functions that have an explicit check for a contained value being present, such as value() and value_or(U&&). Although those redundant assertions should get optimized out in most cases, they might hurt inliner heuristics and generally give the compiler more work to do. And they won't be optimized out at all for non-optimized builds. The current assertions also result in repeated invalid bug reports, such as PR 91281, PR 101659, PR 102712, and PR 107894. We can move the assertions from the internal accessors to the public member functions where the preconditions are specified. Reviewed-by: Ville Voutilainen <ville.voutilainen@gmail.com> libstdc++-v3/ChangeLog: * include/std/optional (_Optional_base_impl::_M_get()): Move assertions to ... (optional::operator->, optional::operator*): ... here.
2024-07-24libstdc++: Fix <ostream> and <istream> for -std=gnu++14 -fconcepts [PR116070]Jonathan Wakely2-2/+2
This questionable combination of flags causes a number of errors. The ones in the rvalue stream overloads need to be fixed in the gcc-14 branch so I'm committing it separately to simplify backporting. libstdc++-v3/ChangeLog: PR libstdc++/116070 * include/std/istream: Check feature test macro before using is_class_v and is_same_v. * include/std/ostream: Likewise.
2024-07-24libstdc++: Fix std::vector<bool> for -std=gnu++14 -fconcepts [PR116070]Jonathan Wakely1-1/+1
This questionable combination of flags causes a number of errors. This one in std::vector<bool> needs to be fixed in the gcc-13 branch so I'm committing it separately to simplify backporting. libstdc++-v3/ChangeLog: PR libstdc++/116070 * include/bits/stl_bvector.h: Check feature test macro before using is_default_constructible_v.
2024-07-24libstdc++: Remove duplicate include header from ranges_algobase.hMichael Levine1-1/+0
The bits/stl_algobase.h header was added to bits/ranges_algobase.h separately through two related commits: r15-1106-g674d213ab91871 r15-1117-g0bb1db32ccf54a The comment for the first time it is included in the file is also incorrect (my error from that 2nd one) since it is really being included for __memcmp, not __memcpy This patch removes the duplicate header include. libstdc++-v3/ChangeLog: * include/bits/ranges_algobase.h: Remove duplicate include of <bits/stl_algobase.h>. Signed-off-by: Michael Levine <mlevine55@bloomberg.net>
2024-07-17c++: diagnose failed qualified lookup into current instPatrick Palka2-2/+2
When the scope of a qualified name is the current instantiation, and qualified lookup finds nothing at template definition time, then we know it'll find nothing at instantiation time (unless the current instantiation has dependent bases). So such qualified name lookup failure can be diagnosed ahead of time as per [temp.res.general]/6. This patch implements that, for qualified names of the form (where the current instantiation is A<T>): this->non_existent a.non_existent A::non_existent typename A::non_existent It turns out we already optimistically attempt qualified lookup of seemingly every qualified name, even when it's dependently scoped, and then suppress issuing a lookup failure diagnostic after the fact. So implementing this is mostly a matter of restricting the diagnostic suppression to "dependentish" scopes (i.e. dependent scopes or the current instantiation with dependent bases), rather than suppressing for any dependently-typed scope as we currently do. The cp_parser_conversion_function_id change is needed to avoid regressing lookup/using8.C: using A<T>::operator typename A<T>::Nested*; When looking up A<T>::Nested we consider it not dependently scoped since we entered A<T> from cp_parser_conversion_function_id earlier. But this A<T> is the implicit instantiation A<T> not the primary template type A<T>, and so the lookup fails which we now diagnose. This patch works around this by not entering the template scope of a qualified conversion function-id in this case, i.e. if we're in an expression vs declaration context, by seeing if the type already went through finish_template_type with entering_scope=true. gcc/cp/ChangeLog: * decl.cc (make_typename_type): Restrict name lookup failure punting to dependentish_scope_p instead of dependent_type_p. * error.cc (qualified_name_lookup_error): Improve diagnostic when the scope is the current instantiation. * parser.cc (cp_parser_diagnose_invalid_type_name): Likewise. (cp_parser_conversion_function_id): Don't call push_scope on a template scope unless we're in a declaration context. (cp_parser_lookup_name): Restrict name lookup failure punting to dependentish_scope_p instead of depedent_type_p. * semantics.cc (finish_id_expression_1): Likewise. * typeck.cc (finish_class_member_access_expr): Likewise. libstdc++-v3/ChangeLog: * include/experimental/socket (basic_socket_iostream::basic_socket_iostream): Fix typo. * include/tr2/dynamic_bitset (__dynamic_bitset_base::_M_is_proper_subset_of): Likewise. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/alignas18.C: Expect name lookup error for U::X. * g++.dg/cpp0x/forw_enum13.C: Expect name lookup error for D3::A and D4<T>::A. * g++.dg/parse/access13.C: Declare A::E::V to avoid name lookup failure and preserve intent of the test. * g++.dg/parse/enum11.C: Expect extra errors, matching the non-template case. * g++.dg/template/crash123.C: Avoid name lookup failure to preserve intent of the test. * g++.dg/template/crash124.C: Likewise. * g++.dg/template/crash7.C: Adjust expected diagnostics. * g++.dg/template/dtor6.C: Declare A::~A() to avoid name lookup failure and preserve intent of the test. * g++.dg/template/error22.C: Adjust expected diagnostics. * g++.dg/template/static30.C: Avoid name lookup failure to preserve intent of the test. * g++.old-deja/g++.other/decl5.C: Adjust expected diagnostics. * g++.dg/template/non-dependent34.C: New test. Reviewed-by: Jason Merrill <jason@redhat.com>
2024-07-12libstdc++: the specialization atomic_ref<bool> should use the primary templateDamien Lebrun-Grandie1-1/+2
Per [atomics.ref.int] `bool` is excluded from the list of integral types for which there is a specialization of the `atomic_ref` class template and [Note 1] clearly states that `atomic_ref<bool>` "uses the primary template" instead. libstdc++-v3/ChangeLog: * include/bits/atomic_base.h (__atomic_ref): Do not use integral specialization for bool. Signed-off-by: Damien Lebrun-Grandie <dalg24@gmail.com>
2024-07-10libstdc++: Make std::basic_format_context non-copyable [PR114387]Jonathan Wakely1-1/+6
Users are not supposed to create objects of this type, and there's no reason it needs to be copyable. LWG 4061 makes it non-copyable and non-default constructible. libstdc++-v3/ChangeLog: PR libstdc++/114387 * include/std/format (basic_format_context): Define copy operations as deleted, as per LWG 4061. * testsuite/std/format/context.cc: New test.
2024-07-10libstdc++: Use direct-initialization for std::vector<bool>'s allocator ↵Jonathan Wakely1-1/+1
[PR115854] The consensus in the standard committee is that this change shouldn't be necessary, and the Allocator requirements should require conversions between rebound allocators to be implicit. But we can make it work for now anyway. libstdc++-v3/ChangeLog: PR libstdc++/115854 * include/bits/stl_bvector.h (_Bvector_base): Convert allocator to rebound type explicitly. * testsuite/23_containers/vector/allocator/115854.cc: New test. * testsuite/23_containers/vector/bool/allocator/115854.cc: New test.
2024-07-10libstdc++: ranges::find needs explicit conversion to size_t [PR115799]Jonathan Wakely1-1/+2
For an integer-class type we need to use an explicit conversion to size_t. libstdc++-v3/ChangeLog: PR libstdc++/115799 * include/bits/ranges_util.h (__find_fn): Make conversion from difference type ti size_t explicit. * testsuite/25_algorithms/find/bytes.cc: Check ranges::find with __gnu_test::test_contiguous_range. * testsuite/std/ranges/range.cc: Adjust expected difference_type for __gnu_test::test_contiguous_range. * testsuite/util/testsuite_iterators.h (contiguous_iterator_wrapper): Use __max_diff_type as difference type. (test_range::sentinel, test_sized_range_sized_sent::sentinel): Ensure that operator- returns difference_type.
2024-07-08libstdc++: Fix _Atomic(T) macro in <stdatomic.h> [PR115807]Jonathan Wakely1-1/+1
The definition of the _Atomic(T) macro needs to refer to ::std::atomic, not some other std::atomic relative to the current namespace. libstdc++-v3/ChangeLog: PR libstdc++/115807 * include/c_compatibility/stdatomic.h (_Atomic): Ensure it refers to std::atomic in the global namespace. * testsuite/29_atomics/headers/stdatomic.h/115807.cc: New test.
2024-07-07libstdc++: Fix std::find for non-contiguous iterators [PR115799]Jonathan Wakely1-24/+20
The r15-1857 change didn't correctly restrict the new optimization to contiguous iterators. libstdc++-v3/ChangeLog: PR libstdc++/115799 * include/bits/stl_algo.h (find): Use 'if constexpr' so that memchr optimization is a discarded statement for non-contiguous iterators. * testsuite/25_algorithms/find/bytes.cc: Check with input iterators.
2024-07-07libstdc++: Fix memchr path in std::ranges::find for non-common range [PR115799]Jonathan Wakely1-10/+9
The memchr optimization introduced in r15-1857 needs to advance the start iterator instead of returning the sentinel. libstdc++-v3/ChangeLog: PR libstdc++/115799 * include/bits/ranges_util.h (__find_fn): Return iterator instead of sentinel. * testsuite/25_algorithms/find/constrained.cc: Check non-common contiguous sized range of char.
2024-07-06libstdc++: Use reserved form of [[__likely__]] in <variant>Jonathan Wakely1-1/+1
We should not use [[unlikely]] before C++20, so use [[__unlikely__]] instead. libstdc++-v3/ChangeLog: * include/std/variant (_Variant_storage::_M_reset): Use __unlikely__ form of attribute instead of unlikely.
2024-07-06libstdc++: Restore support for including <name.h> in extern "C" [PR115797]Jonathan Wakely1-0/+3
The r15-1857 change means that <type_traits> is included by <cmath> for C++17 and up, which breaks code including <math.h> inside an extern "C" block. Although doing that is not allowed by the C++ standard, there's lots of existing code which incorrectly thinks it's a good idea and so we try to support it. libstdc++-v3/ChangeLog: PR libstdc++/115797 * include/std/type_traits: Ensure "C++" language linkage. * testsuite/17_intro/headers/c++2011/linkage.cc: Replace dg-options with c++11 target selector.
2024-07-05libstdc++: Use RAII in <bits/stl_uninitialized.h>Jonathan Wakely1-209/+156
This adds an _UninitDestroyGuard class template, similar to ranges::_DestroyGuard used in <bits/ranges_uninitialized.h>. This allows us to remove all the try-catch blocks and rethrows, because any required cleanup gets done in the guard destructor. libstdc++-v3/ChangeLog: * include/bits/stl_uninitialized.h (_UninitDestroyGuard): New class template and partial specialization. (__do_uninit_copy, __do_uninit_fill, __do_uninit_fill_n) (__uninitialized_copy_a, __uninitialized_fill_a) (__uninitialized_fill_n_a, __uninitialized_copy_move) (__uninitialized_move_copy, __uninitialized_fill_move) (__uninitialized_move_fill, __uninitialized_default_1) (__uninitialized_default_n_a, __uninitialized_default_novalue_1) (__uninitialized_default_novalue_n_1, __uninitialized_copy_n) (__uninitialized_copy_n_pair): Use it.
2024-07-05libstdc++: Use memchr to optimize std::find [PR88545]Jonathan Wakely3-2/+67
This optimizes std::find to use memchr when searching for an integer in a range of bytes. libstdc++-v3/ChangeLog: PR libstdc++/88545 PR libstdc++/115040 * include/bits/cpp_type_traits.h (__can_use_memchr_for_find): New variable template. * include/bits/ranges_util.h (__find_fn): Use memchr when possible. * include/bits/stl_algo.h (find): Likewise. * testsuite/25_algorithms/find/bytes.cc: New test.
2024-06-28libstdc++: Extend std::equal memcmp optimization to std::byte [PR101485]Jonathan Wakely1-1/+5
We optimize std::equal to memcmp for integers and pointers, which means that std::byte comparisons generate bigger code than char comparisons. We can't use memcmp for arbitrary enum types, because they could have an overloaded operator== that has custom semantics, but we know that std::byte doesn't do that. libstdc++-v3/ChangeLog: PR libstdc++/101485 * include/bits/stl_algobase.h (__equal_aux1): Check for std::byte as well. * testsuite/25_algorithms/equal/101485.cc: New test.
2024-06-28libstdc++: Do not use C++11 alignof in C++98 mode [PR104395]Jonathan Wakely6-12/+12
When -faligned-new (or Clang's -faligned-allocation) is used our allocators try to support extended alignments, gated on the __cpp_aligned_new macro. However, because they use alignof(_Tp) which is not a keyword in C++98 mode, using -std=c++98 -faligned-new results in errors from <memory> and other headers. We could change them to use __alignof__ instead of alignof, but that would potentially alter the result of the conditions, because e.g. alignof(long long) != __alignof__(long long) on some targets. That's probably not an issue for any types with extended alignment, so maybe it would be a safe change. For now, it seems acceptable to just disable the extended alignment support in C++98 mode, so that -faligned-new enables std::align_val_t and the corresponding operator new overloads, but doesn't affect std::allocator, __gnu_cxx::__bitmap_allocator etc. libstdc++-v3/ChangeLog: PR libstdc++/104395 * include/bits/new_allocator.h: Disable extended alignment support in C++98 mode. * include/bits/stl_tempbuf.h: Likewise. * include/ext/bitmap_allocator.h: Likewise. * include/ext/malloc_allocator.h: Likewise. * include/ext/mt_allocator.h: Likewise. * include/ext/pool_allocator.h: Likewise. * testsuite/ext/104395.cc: New test.
2024-06-28libstdc++: Simplify <ext/aligned_buffer.h> class templatesJonathan Wakely1-10/+10
As noted in a comment, the __gnu_cxx::__aligned_membuf class template can be simplified, because alignof(T) and alignas(T) use the correct alignment for a data member. That's true since GCC 8 and Clang 8. The EDG front end (as used by Intel icc, aka "Intel C++ Compiler Classic") does not implement the PR c++/69560 change, so keep using the old implementation when __EDG__ is defined, to avoid an ABI change for icc. For __gnu_cxx::__aligned_buffer<T> all supported compilers agree on the value of __alignof__(T), but we can still simplify it by removing the dependency on std::aligned_storage<sizeof(T), __alignof__(T)>. Add a test that checks that the aligned buffer types have the expected alignment, so that we can tell if changes like this affect their ABI properties. libstdc++-v3/ChangeLog: * include/ext/aligned_buffer.h (__aligned_membuf): Use alignas(T) directly instead of defining a struct and using 9its alignment. (__aligned_buffer): Remove use of std::aligned_storage. * testsuite/abi/aligned_buffers.cc: New test.
2024-06-27libstdc++: Fix std::format for chrono::duration with unsigned rep [PR115668]Jonathan Wakely1-1/+4
Using std::chrono::abs is only valid if numeric_limits<rep>::is_signed is true, so using it unconditionally made it ill-formed to format a duration with an unsigned rep. The duration formatter might as negate the duration itself instead of using chrono::abs, because it already needs to check for a negative value. libstdc++-v3/ChangeLog: PR libstdc++/115668 * include/bits/chrono_io.h (formatter<duration<R,P, C>::format): Do not use chrono::abs. * testsuite/20_util/duration/io.cc: Check formatting a duration with unsigned rep.
2024-06-27libstdc++: Add debug assertions to std::vector<bool> [PR103191]Jonathan Wakely1-6/+24
This adds debug assertions for std::vector<bool> element access. libstdc++-v3/ChangeLog: PR libstdc++/103191 * include/bits/stl_bvector.h (vector<bool>::operator[]) (vector<bool>::front, vector<bool>::back): Add debug assertions. * testsuite/23_containers/vector/bool/element_access/constexpr.cc: Remove dg-error that no longer triggers.
2024-06-27libstdc++: Enable more debug assertions during constant evaluation [PR111250]Jonathan Wakely1-6/+8
Some of our debug assertions expand to nothing unless _GLIBCXX_ASSERTIONS is defined, which means they are not checked during constant evaluation. By making them unconditionally expand to a __glibcxx_assert expression they will be checked during constant evaluation. This allows us to diagnose more instances of undefined behaviour at compile-time, such as accessing a vector past-the-end. libstdc++-v3/ChangeLog: PR libstdc++/111250 * include/debug/assertions.h (__glibcxx_requires_non_empty_range) (__glibcxx_requires_nonempty, __glibcxx_requires_subscript): Define to __glibcxx_assert expressions or to debug mode __glibcxx_check_xxx expressions. * testsuite/23_containers/array/element_access/constexpr_c++17.cc: Add checks for out-of-bounds accesses in constant expressions. * testsuite/23_containers/vector/element_access/constexpr.cc: Likewise.
2024-06-25libstdc++: Simplify std::valarray initialization helpersJonathan Wakely1-79/+18
Dispatching to partial specializations doesn't really seem to offer much benefit here. The __is_trivial(T) condition is a compile-time constant so the untaken branches are dead code and don't cost us anything. libstdc++-v3/ChangeLog: * include/bits/valarray_array.h (_Array_default_ctor): Remove. (__valarray_default_construct): Inline it into here. (_Array_init_ctor): Remove. (__valarray_fill_construct): Inline it into here. (_Array_copy_ctor): Remove. (__valarray_copy_construct(const T*, const T*, T*)): Inline it into here. (__valarray_copy_construct(const T*, size_t, size_t, T*)): Use _GLIBCXX17_CONSTEXPR for constant condition.
2024-06-21libstdc++: Remove std::__is_pointer and std::__is_scalar [PR115497]Jonathan Wakely1-33/+0
This removes the std::__is_pointer and std::__is_scalar traits, as they conflicts with a Clang built-in. Although Clang has a hack to make the class templates work despite using reserved names, removing these class templates will allow that hack to be dropped at some future date. libstdc++-v3/ChangeLog: PR libstdc++/115497 * include/bits/cpp_type_traits.h (__is_pointer, __is_scalar): Remove. (__is_arithmetic): Do not use __is_pointer in the primary template. Add partial specialization for pointers.
2024-06-21libstdc++: Remove std::__is_void class template [PR115497]Jonathan Wakely2-18/+2
This removes the std::__is_void trait, as it conflicts with a Clang built-in. There is only one use of the trait, which can easily be replaced by simpler code. Although Clang has a hack to make the class template work despite using a reserved name, removing std::__is_void will allow that hack to be dropped at some future date. libstdc++-v3/ChangeLog: PR libstdc++/115497 * include/bits/cpp_type_traits.h (__is_void): Remove. * include/debug/helper_functions.h (_Distance_traits): Adjust partial specialization to match void directly, instead of using __is_void<T>::__type and matching __true_type.
2024-06-21libstdc++: Stop using std::__is_pointer in <deque> and <algorithm> [PR115497]Jonathan Wakely2-11/+21
This replaces all uses of the std::__is_pointer type trait with uses of the new __is_pointer built-in. Since the class template was only used to enable some performance optimizations for algorithms, we can use the built-in when __has_builtin(__is_pointer) is true (which is the case for GCC trunk and for current versions of Clang) and just forego the optimization otherwise. Removing the uses of std::__is_pointer means it can be removed from <bits/cpp_type_traits.h>, which is another step towards fixing PR 115497. libstdc++-v3/ChangeLog: PR libstdc++/115497 * include/bits/deque.tcc (__lex_cmp_dit): Replace __is_pointer class template with __is_pointer(T) built-in. (__lexicographical_compare_aux1): Likewise. * include/bits/stl_algobase.h (__equal_aux1): Likewise. (__lexicographical_compare_aux1): Likewise.
2024-06-21libstdc++: Don't use std::__is_scalar in std::valarray initialization [PR115497]Jonathan Wakely1-2/+2
This removes the use of the std::__is_scalar trait from <valarray>, where it can be replaced by __is_trivial. It's used to decide whether we can use memset to value-initialize valarray elements, but memset is suitable for any trivial types, because value-initializing them is equivalent to filling them with zeros. This is another step towards removing the class templates in <bits/cpp_type_traits.h> that conflict with Clang built-in names. libstdc++-v3/ChangeLog: PR libstdc++/115497 * include/bits/valarray_array.h (__valarray_default_construct): Use __is_trivial(_Tp). instead of __is_scalar<_Tp>.
2024-06-21libstdc++: Fix std::fill and std::fill_n optimizations [PR109150]Jonathan Wakely1-30/+49
As noted in the PR, the optimization used for scalar types in std::fill and std::fill_n is non-conforming, because it doesn't consider that assigning a scalar type might have non-trivial side effects which are affected by the optimization. By changing the condition under which the optimization is done we ensure it's only performed when safe to do so, and we also enable it for additional types, which was the original subject of the PR. Instead of two overloads using __enable_if<__is_scalar<T>::__value, R> we can combine them into one and create a local variable which is either a local copy of __value or another reference to it, depending on whether the optimization is allowed. This removes a use of std::__is_scalar, which is a step towards fixing PR 115497 by removing std::__is_pointer from <bits/cpp_type_traits.h> libstdc++-v3/ChangeLog: PR libstdc++/109150 * include/bits/stl_algobase.h (__fill_a1): Combine the !__is_scalar and __is_scalar overloads into one and rewrite the condition used to decide whether to perform the load outside the loop. * testsuite/25_algorithms/fill/109150.cc: New test. * testsuite/25_algorithms/fill_n/109150.cc: New test.
2024-06-21libstdc++: Qualify calls in <bits/stl_uninitialized.h> to prevent ADLJonathan Wakely1-4/+4
libstdc++-v3/ChangeLog: * include/bits/stl_uninitialized.h (uninitialized_default_construct) (uninitialized_default_construct_n, uninitialized_value_construct) (uninitialized_value_construct_n): Qualify calls to prevent ADL.
2024-06-21libstdc++: Make std::any_cast<void> ill-formed (LWG 3305)Jonathan Wakely1-0/+8
LWG 3305 was approved earlier this year in Tokyo. We need to give an error if using std::any_cast<void>, but std::any_cast<void()> is valid (but always returns null). libstdc++-v3/ChangeLog: * include/std/any (any_cast(any*), any_cast(const any*)): Add static assertion to reject void types, as per LWG 3305. * testsuite/20_util/any/misc/lwg3305.cc: New test.
2024-06-21libstdc++: Undeprecate std::pmr::polymorphic_allocator::destroy (P2875R4)Jonathan Wakely1-1/+0
This member function was previously deprecated, but that was reverted by P2875R4, approved earlier this year in Tokyo. Since it's not going to be deprecated in C++26, and so presumably not removed, there is no point in giving deprecated warnings for C++23 mode. libstdc++-v3/ChangeLog: * include/bits/memory_resource.h (polymorphic_allocator::destroy): Remove deprecated attribute.
2024-06-21libstdc++: Add deprecation warnings to <strstream> typesJonathan Wakely2-8/+24
libstdc++-v3/ChangeLog: * include/backward/backward_warning.h: Adjust comments to suggest <spanstream> as another alternative to <strstream>. * include/backward/strstream (strstreambuf, istrstream) (ostrstream, strstream): Add deprecated attribute.
2024-06-21libstdc++: Add [[deprecated]] to std::wstring_convert and std::wbuffer_convertJonathan Wakely1-2/+3
These were deprecated in C++17 and std::wstring_convert is planned for removal in C++26. libstdc++-v3/ChangeLog: * include/bits/locale_conv.h (wstring_convert): Add deprecated attribute for C++17 and later. (wbuffer_convert): Likewise. * testsuite/22_locale/codecvt/codecvt_utf16/79980.cc: Disable deprecated warnings. * testsuite/22_locale/codecvt/codecvt_utf8/79980.cc: Likewise. * testsuite/22_locale/codecvt/codecvt_utf8_utf16/79511.cc: Likewise. * testsuite/22_locale/conversions/buffer/1.cc: Add dg-warning. * testsuite/22_locale/conversions/buffer/2.cc: Likewise. * testsuite/22_locale/conversions/buffer/3.cc: Likewise. * testsuite/22_locale/conversions/buffer/requirements/typedefs.cc: Likewise. * testsuite/22_locale/conversions/string/1.cc: Likewise. * testsuite/22_locale/conversions/string/2.cc: Likewise. * testsuite/22_locale/conversions/string/3.cc: Likewise. * testsuite/22_locale/conversions/string/66441.cc: Likewise. * testsuite/22_locale/conversions/string/requirements/typedefs-2.cc: Likewise. * testsuite/22_locale/conversions/string/requirements/typedefs.cc: Likewise.
2024-06-21libstdc++: Fix __cpp_lib_chrono for old std::string ABIJonathan Wakely2-1/+2
The <chrono> header is incomplete for the old std::string ABI, because std::chrono::tzdb is only defined for the new ABI. The feature test macro advertising full C++20 support should not be defined for the old ABI. libstdc++-v3/ChangeLog: * include/bits/version.def (chrono): Add cxx11abi = yes. * include/bits/version.h: Regenerate. * testsuite/std/time/syn_c++20.cc: Adjust expected value for the feature test macro.
2024-06-21libstdc++: Fix std::to_array for trivial-ish types [PR115522]Jonathan Wakely1-2/+6
Due to PR c++/85723 the std::is_trivial trait is true for types with a deleted default constructor, so the use of std::is_trivial in std::to_array is not sufficient to ensure the type can be trivially default constructed then filled using memcpy. I also forgot that a type with a deleted assignment operator can still be trivial, so we also need to check that it's assignable because the is_constant_evaluated() path can't use memcpy. Replace the uses of std::is_trivial with std::is_trivially_copyable (needed for memcpy), std::is_trivially_default_constructible (needed so that the default construction is valid and does no work) and std::is_copy_assignable (needed for the constant evaluation case). libstdc++-v3/ChangeLog: PR libstdc++/115522 * include/std/array (to_array): Workaround the fact that std::is_trivial is not sufficient to check that a type is trivially default constructible and assignable. * testsuite/23_containers/array/creation/115522.cc: New test.
2024-06-20libstdc++: Fix find_last_set(simd_mask) to ignore padding bitsMatthias Kretz1-13/+13
With the change to the AVX512 find_last_set implementation, the change to AVX512 operator!= is unnecessary. However, the latter was not producing optimal code and unnecessarily set the padding bits. In theory, the compiler could determine that with the new != implementation, the bit operation for clearing the padding bits is a no-op and can be elided. Signed-off-by: Matthias Kretz <m.kretz@gsi.de> libstdc++-v3/ChangeLog: PR libstdc++/115454 * include/experimental/bits/simd_x86.h (_S_not_equal_to): Use neq comparison instead of bitwise negation after eq. (_S_find_last_set): Clear unused high bits before computing bit_width. * testsuite/experimental/simd/pr115454_find_last_set.cc: New test.
2024-06-19libstdc++: Consistently indent <future> with tabsJonathan Wakely1-164/+164
libstdc++-v3/ChangeLog: * include/std/future: Adjust whitespace to use tabs for indentation.
2024-06-19libstdc++: Add noexcept to some std::promise shared state internalsJonathan Wakely1-2/+2
Making the state ready for a std::promise<void> only needs to move a unique_ptr, which cannot throw. Make its call operator noexcept. Similarly, making the state ready by storing an exception_ptr also can't throw, so make that call operator noexcept too. libstdc++-v3/ChangeLog: * include/std/future (_State_baseV2::_Setter<R, void>): Add noexcept to call operator. (_State_baseV2::_Setter<R, __exception_ptr_tag>): Likewise.
2024-06-19libstdc++: Add conditional noexcept to std::pair default ctorJonathan Wakely1-0/+2
Most of std::pair constructors implemented using C++20 concepts have a conditional noexcept-specifier, but the default constructor doesn't. This fixes that. libstdc++-v3/ChangeLog: * include/bits/stl_pair.h [__cpp_lib_concepts] (pair()): Add conditional noexcept.
2024-06-19libstdc++: Fix warning regressions in <bits/stl_tempbuf.h>Jonathan Wakely1-4/+4
I caused some new warnings with -Wsystem-headers with my recent changes to std::get_temporary_buffer and std::_Temporary_buffer. There's a -Wsign-compare warning which can be avoided by casting the ptrdiff_t argument to size_t (which also conveniently rejects negative values). There's also a -Wdeprecated-declarations warning because I moved where std::get_temporary_buffer is called, but didn't move the diagnostic pragmas that suppress the warning for calling it. libstdc++-v3/ChangeLog: * include/bits/stl_tempbuf.h (__get_temporary_buffer): Cast argument to size_t to handle negative values and suppress -Wsign-compare warning. (_Temporary_buffer): Move diagnostic pragmas to new location of call to std::get_temporary_buffer.
2024-06-18libstdc++: Fix outdated comment about standard integer typesJonathan Wakely1-4/+2
The long long and unsigned long long types have been standard since C++11, so are not extensions. There are also the char8_t, char16_t and char32_t types. Just refer to the standard integer types, without saying how many there are. libstdc++-v3/ChangeLog: * include/bits/cpp_type_traits.h: Fix outdated comment about the number of standard integer types.