aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3
AgeCommit message (Collapse)AuthorFilesLines
2022-09-03Daily bump.GCC Administrator1-0/+42
2022-09-02libstdc++: Consistently use ::type when deriving from __and/or/not_Patrick Palka2-6/+6
Now that these internal type traits are (again) class templates, it's better to derive from the trait's ::type instead of from the trait itself, for sake of a shallower inheritance chain. libstdc++-v3/ChangeLog: * include/std/tuple (tuple::_UseOtherCtor): Use ::type when deriving from __and_, __or_ or __not_. * include/std/type_traits (negation): Likewise. (is_unsigned): Likewise. (__is_implicitly_default_constructible): Likewise. (is_trivially_destructible): Likewise. (__is_nt_invocable_impl): Likewise.
2022-09-02libstdc++: Optimize constructible/assignable variable templatesJonathan Wakely1-39/+49
This defines the is_xxx_constructible_v and is_xxx_assignable_v variable templates by using the built-ins directly. The actual logic for each one is the same as the corresponding class template, but way using the variable template doesn't need to instantiate the class template. This means that the variable templates won't use the static assertions checking for complete types, cv void or unbounded arrays, but that's OK because the built-ins check those anyway. We could probably remove the static assertions from the class templates, and maybe from all type traits that use a built-in. libstdc++-v3/ChangeLog: * include/std/type_traits (is_constructible_v) (is_default_constructible_v, is_copy_constructible_v) (is_move_constructible_v): Define using __is_constructible. (is_assignable_v, is_copy_assignable_v, is_move_assignable_v): Define using __is_assignable. (is_trivially_constructible_v) (is_trivially_default_constructible_v) (is_trivially_copy_constructible_v) (is_trivially_move_constructible_v): Define using __is_trivially_constructible. (is_trivially_assignable_v, is_trivially_copy_assignable_v) (is_trivially_move_assignable_v): Define using __is_trivially_assignable. (is_nothrow_constructible_v) (is_nothrow_default_constructible_v) (is_nothrow_copy_constructible_v) (is_nothrow_move_constructible_v): Define using __is_nothrow_constructible. (is_nothrow_assignable_v, is_nothrow_copy_assignable_v) (is_nothrow_move_assignable_v): Define using __is_nothrow_assignable.
2022-09-02libstdc++: Fix laziness of __and/or/not_Patrick Palka2-3/+38
r13-2230-g390f94eee1ae69 redefined the internal logical operator traits __and_, __or_ and __not_ as alias templates that directly resolve to true_type or false_type. But it turns out using an alias template here causes the traits to be less lazy than before because we now compute the logical result immediately upon _specialization_ of the trait, and not later upon _completion_ of the specialization. So for example, in using type = __and_<A, __not_<B>>; we now compute the conjunction and thus instantiate A even though we're in a context that doesn't require completion of the __and_. What's worse is that we also compute the inner negation and thus instantiate B (for the same reason), independent of the __and_ and the value of A! Thus the traits are now less lazy and composable than before. Fortunately, the fix is cheap and straightforward: redefine these traits as class templates instead of as alias templates so that computation of the logical result is triggered by completion, not by specialization. libstdc++-v3/ChangeLog: * include/std/type_traits (__or_, __and_, __not_): Redefine as a class template instead of as an alias template. * testsuite/20_util/logical_traits/requirements/short_circuit.cc: Add more tests for conjunction and disjunction. Add corresponding tests for __and_ and __or_.
2022-09-02Daily bump.GCC Administrator1-0/+99
2022-09-01libstdc++: Add 'typename' for Clang compatibilityJonathan Wakely1-1/+1
Clang doesn't yet implement the C++20 change that makes 'typename' optional here. libstdc++-v3/ChangeLog: * include/std/ranges (adjacent_transform_view::_Iterator): Add typename keyword before dependent qualified-id.
2022-09-01libstdc++: Remove __is_referenceable helperJonathan Wakely1-21/+16
We only use the __is_referenceable helper in three places now: add_pointer, add_lvalue_reference, and add_rvalue_reference. But lots of other traits depend on add_[lr]value_reference, and decay depends on add_pointer, so removing the instantiation of __is_referenceable helps compile all those other traits slightly faster. We can just use void_t<T&> to check for a referenceable type in the add_[lr]value_reference traits. Then we can specialize add_pointer for reference types, so that we don't need to use remove_reference, and then use void_t<T*> for all non-reference types to detect when we can form a pointer to the type. libstdc++-v3/ChangeLog: * include/std/type_traits (__is_referenceable): Remove. (__add_lvalue_reference_helper, __add_rvalue_reference_helper): Use __void_t instead of __is_referenceable. (__add_pointer_helper): Likewise. (add_pointer): Add partial specializations for reference types.
2022-09-01libstdc++: Optimize is_constructible traitsJonathan Wakely1-182/+57
We can replace some class template helpers with alias templates, which are cheaper to instantiate. For example, replace the __is_copy_constructible_impl class template with an alias template that uses just evaluates the __is_constructible built-in, using add_lvalue_reference<const T> to get the argument type in a way that works for non-referenceable types. For a given specialization of is_copy_constructible this results in the same number of class templates being instantiated (for the common case of non-void, non-function types), but the add_lvalue_reference instantiations are not specific to the is_copy_constructible specialization and so can be reused by other traits. Previously __is_copy_constructible_impl was a distinct class template and its specializations were never used for anything except is_copy_constructible. With the new definitions of these traits that don't depend on helper classes, it becomes more practical to optimize the is_xxx_constructible_v variable templates to avoid instantiations. Previously doing so would have meant two entirely separate implementation strategies for these traits. libstdc++-v3/ChangeLog: * include/std/type_traits (__is_constructible_impl): Replace class template with alias template. (is_default_constructible, is_nothrow_constructible) (is_nothrow_constructible): Simplify base-specifier. (__is_copy_constructible_impl, __is_move_constructible_impl) (__is_nothrow_copy_constructible_impl) (__is_nothrow_move_constructible_impl): Remove class templates. (is_copy_constructible, is_move_constructible) (is_nothrow_constructible, is_nothrow_default_constructible) (is_nothrow_copy_constructible, is_nothrow_move_constructible): Adjust base-specifiers to use __is_constructible_impl. (__is_copy_assignable_impl, __is_move_assignable_impl) (__is_nt_copy_assignable_impl, __is_nt_move_assignable_impl): Remove class templates. (__is_assignable_impl): New alias template. (is_assignable, is_copy_assignable, is_move_assignable): Adjust base-specifiers to use new alias template. (is_nothrow_copy_assignable, is_nothrow_move_assignable): Adjust base-specifiers to use existing alias template. (__is_trivially_constructible_impl): New alias template. (is_trivially_constructible, is_trivially_default_constructible) (is_trivially_copy_constructible) (is_trivially_move_constructible): Adjust base-specifiers to use new alias template. (__is_trivially_assignable_impl): New alias template. (is_trivially_assignable, is_trivially_copy_assignable) (is_trivially_move_assignable): Adjust base-specifier to use new alias template. (__add_lval_ref_t, __add_rval_ref_t): New alias templates. (add_lvalue_reference, add_rvalue_reference): Use new alias templates.
2022-09-01libstdc++: Optimize std::decayJonathan Wakely1-19/+20
Define partial specializations of std::decay and its __decay_selector helper so that remove_reference, is_array and is_function are not instantiated for every type, and remove_extent is not instantiated for arrays. libstdc++-v3/ChangeLog: * include/std/type_traits (__decay_selector): Add partial specializations for array types. Only check for function types when not dealing with an array. (decay): Add partial specializations for reference types.
2022-09-01libstdc++: Add specializations for some variable templatesJonathan Wakely1-7/+17
This avoids having to instantiate a class template when we can detect the true cases easily with a partial specialization. libstdc++-v3/ChangeLog: * include/std/type_traits (is_lvalue_reference_v) (is_rvalue_reference_v, is_reference_v, is_const_v) (is_volatile_v): Define using partial specializations instead of instantiating class templates.
2022-09-01libstdc++: Use built-ins for some variable templatesJonathan Wakely1-12/+15
This avoids having to instantiate a class template that just uses the same built-in anyway. None of the corresponding class templates have any type-completeness static assertions, so we're not losing any diagnostics by using the built-ins directly. libstdc++-v3/ChangeLog: * include/std/type_traits (is_enum_v, is_class_v, is_union_v) (is_empty_v, is_polymoprhic_v, is_abstract_v, is_final_v) (is_base_of_v, is_aggregate_v): Use built-in directly instead of instantiating class template.
2022-09-01libstdc++: Remove FIXME for ICE with remove_cvref_t in requires-expressionJonathan Wakely1-10/+1
PR c++/99968 is fixed since GCC 12.1 so we can remove the workaround. libstdc++-v3/ChangeLog: * include/std/type_traits (is_scoped_enum): Remove workaround.
2022-09-01libstdc++: Implement ranges::adjacent_transform_view from P2321R2Patrick Palka2-0/+447
libstdc++-v3/ChangeLog: * include/std/ranges (__detail::__unarize): Define. (adjacent_view::_Iterator): Befriend adjacent_transform_view. (adjacent_transform_view): Define. (adjacent_transform_view::_Iterator): Define. (adjacent_transform_view::_Sentinel): Define. (views::__detail::__can_adjacent_transform_view): Define. (views::_AdjacentTransform): Define. (views::adjacent_transform): Define. (views::pairwise_transform): Define. * testsuite/std/ranges/adaptors/adjacent_transform/1.cc: New test.
2022-09-01libstdc++: Optimize array traitsJonathan Wakely1-31/+67
Improve compile times by avoiding unnecessary class template instantiations. __is_array_known_bounds and __is_array_unknown_bounds can be defined without instantiating extent, by providing partial specializations for the true cases. std::extent can avoid recursing down through a multidimensional array, so it stops after providing the result. Previously extent<T[n][m], 0> would instantiate extent<T[n], -1u> and extent<T, -2u> as well. std::is_array_v can use partial specializations to avoid instantiating std::is_array, and similarly for std::rank_v and std::extent_v. std::is_bounded_array_v and std::is_unbounded_array_v can also use partial specializations, and then the class templates can be defined in terms of the variable templates. This makes sense for these traits, because they are new in C++20 and so the variable templates are always available, which isn't true in general for C++11 and C++14 traits. libstdc++-v3/ChangeLog: * include/std/type_traits (__is_array_known_bounds): Add partial specialization instead of using std::extent. (__is_array_unknown_bounds): Likewise. (extent): Add partial specializations to stop recursion after the result is found. (is_array_v): Add partial specializations instead of instantiating the class template. (rank_v, extent_v): Likewise. (is_bounded_array_v, is_unbounded_array_v): Likewise. (is_bounded_array, is_unbounded_array): Define in terms of the variable templates.
2022-09-01Daily bump.GCC Administrator1-0/+137
2022-08-31libstdc++: A few more minor <ranges> cleanupsPatrick Palka2-22/+20
libstdc++-v3/ChangeLog: * include/bits/ranges_base.h (__advance_fn::operator()): Add parentheses in assert condition to avoid -Wparentheses warning. * include/std/ranges: (take_view::take_view): Uglify 'base'. (take_while_view::take_while_view): Likewise. (elements_view::elements_view): Likewise. (views::_Zip::operator()): Adjust position of [[nodiscard]] for compatibility with -fconcepts-ts. (zip_transform_view::_Sentinel): Uglify 'OtherConst'. (views::_ZipTransform::operator()): Adjust position of [[nodiscard]] for compatibilty with -fconcepts-ts.
2022-08-3132-bit PA-RISC with HP-UX: remove deprecated portsMartin Liska2-23/+0
ChangeLog: * configure: Regenerate. * configure.ac: Delete hpux9 and hpux10. config/ChangeLog: * mh-pa-hpux10: Removed. contrib/ChangeLog: * config-list.mk: Remove deprecated ports. contrib/header-tools/ChangeLog: * README: Remove deprecated ports. * reduce-headers: Likewise. gcc/ChangeLog: * config.build: Remove deprecated ports. * config.gcc: Likewise. * config.host: Likewise. * configure.ac: Likewise. * configure: Regenerate. * config/pa/pa-hpux10.h: Removed. * config/pa/pa-hpux10.opt: Removed. * config/pa/t-dce-thr: Removed. gnattools/ChangeLog: * configure.ac: Remove deprecated ports. * configure: Regenerate. libstdc++-v3/ChangeLog: * configure: Regenerate. * crossconfig.m4: Remove deprecated ports. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/lambda/lambda-conv.C: Remove useless test. * gcc.c-torture/execute/ieee/hugeval.x: Likewise. * gcc.dg/torture/pr47917.c: Likewise. * lib/target-supports.exp: Likewise. libgcc/ChangeLog: * config.host: Remove hppa. libitm/ChangeLog: * configure: Regenerate. fixincludes/ChangeLog: * configure: Regenerate.
2022-08-31libstdc++: [_GLIBCXX_DEBUG] Review nullptr assertion diagnosticsFrançois Dumont8-16/+44
Review null string checks to show: _String != nullptr rather than: _String != 0 libstdc++-v3/ChangeLog: * include/debug/debug.h: Use nullptr rather than '0' in checks in post-C++11. * include/debug/string: Likewise. * testsuite/21_strings/basic_string/operations/ends_with/char.cc: Use __gnu_test::string. * testsuite/21_strings/basic_string/operations/ends_with/nonnull.cc: Likewise. * testsuite/21_strings/basic_string/operations/ends_with/wchar_t.cc: Likewise. * testsuite/21_strings/basic_string/operations/starts_with/wchar_t.cc: Likewise. * testsuite/21_strings/basic_string/operations/starts_with/nonnull.cc: Likewise. * testsuite/21_strings/basic_string/operations/starts_with/char.cc: Likewise..
2022-08-31libstdc++: Implement ranges::adjacent_view from P2321R2Patrick Palka2-0/+468
libstdc++-v3/ChangeLog: * include/std/ranges (adjacent_view): Define. (enable_borrowed_range<adjacent_view>): Define. (__detail::__repeated_tuple): Define. (adjacent_view::_Iterator): Define. (adjacent_view::_Sentinel): Define. (views::__detail::__can_adjacent_view): Define. (views::_Adjacent): Define. (views::adjacent): Define. (views::pairwise): Define. * testsuite/std/ranges/adaptors/adjacent/1.cc: New test.
2022-08-31libstdc++: [_GLIBCXX_DEBUG] Add backtrace generation on demandFrançois Dumont8-9/+157
Add _GLIBCXX_DEBUG_BACKTRACE macro to activate backtrace generation on _GLIBCXX_DEBUG assertions. Prerequisite is to have configure the lib with: --enable-libstdcxx-backtrace=yes libstdc++-v3/ChangeLog: * include/debug/formatter.h [_GLIBCXX_HAVE_STACKTRACE](__glibcxx_backtrace_state): Declare. [_GLIBCXX_HAVE_STACKTRACE](__glibcxx_backtrace_create_state): Declare. [_GLIBCXX_HAVE_STACKTRACE](__glibcxx_backtrace_full_callback): Define. [_GLIBCXX_HAVE_STACKTRACE](__glibcxx_backtrace_error_callback): Define. [_GLIBCXX_HAVE_STACKTRACE](__glibcxx_backtrace_full_func): Define. [_GLIBCXX_HAVE_STACKTRACE](__glibcxx_backtrace_full): Declare. [_GLIBCXX_HAVE_STACKTRACE](_Error_formatter::_M_backtrace_state): New. [_GLIBCXX_HAVE_STACKTRACE](_Error_formatter::_M_backtrace_full): New. * src/c++11/debug.cc [_GLIBCXX_HAVE_STACKTRACE](print_backtrace): New. (_Error_formatter::_M_error()): Adapt. * src/libbacktrace/Makefile.am: Add backtrace.c. * src/libbacktrace/Makefile.in: Regenerate. * src/libbacktrace/backtrace-rename.h (backtrace_full): New. * testsuite/23_containers/vector/debug/assign4_backtrace_neg.cc: New test. * doc/xml/manual/debug_mode.xml: Document _GLIBCXX_DEBUG_BACKTRACE. * doc/xml/manual/using.xml: Likewise.
2022-08-31libstdc++: Add test for std::con/disjunction's short circuitingPatrick Palka1-0/+26
libstdc++-v3/ChangeLog: * testsuite/20_util/logical_traits/requirements/short_circuit.cc: New test.
2022-08-31libstdc++: Add noexcept-specifier to std::reference_wrapper::operator()Jonathan Wakely2-1/+17
This isn't required by the standard, but there's an LWG issue suggesting to add it. Also use __invoke_result instead of result_of, to match the spec in recent standards. libstdc++-v3/ChangeLog: * include/bits/refwrap.h (reference_wrapper::operator()): Add noexcept-specifier and use __invoke_result instead of result_of. * testsuite/20_util/reference_wrapper/invoke-noexcept.cc: New test.
2022-08-31libstdc++: Improve comments in std::reference_wrapper testsJonathan Wakely3-2/+6
libstdc++-v3/ChangeLog: * testsuite/20_util/reference_wrapper/invoke-2.cc: Improve comments. * testsuite/20_util/reference_wrapper/invoke-3.cc: Likewise. * testsuite/20_util/reference_wrapper/invoke.cc: Likewise.
2022-08-31libstdc++: Add [[nodiscard]] attribute to <string> and <string_view>Jonathan Wakely29-157/+279
libstdc++-v3/ChangeLog: * include/bits/basic_string.h (basic_string): Add nodiscard attribute to all relevant functions. * include/std/string_view (basic_string_view): Likewise. * testsuite/21_strings/basic_string/capacity/1.cc: Cast unused results to void. * testsuite/21_strings/basic_string/capacity/char/1.cc: Likewise. * testsuite/21_strings/basic_string/capacity/wchar_t/1.cc: Likewise. * testsuite/21_strings/basic_string/cons/char/self_move.cc: Likewise. * testsuite/21_strings/basic_string/element_access/char/1.cc: Likewise. * testsuite/21_strings/basic_string/element_access/char/21674.cc: Likewise. * testsuite/21_strings/basic_string/element_access/wchar_t/1.cc: Likewise. * testsuite/21_strings/basic_string/element_access/wchar_t/21674.cc: Likewise. * testsuite/21_strings/basic_string/lwg2758.cc: Likewise. * testsuite/21_strings/basic_string/lwg2946.cc: Likewise. * testsuite/21_strings/basic_string/operations/contains/nonnull.cc: Add -Wno-unused-result to options. * testsuite/21_strings/basic_string/operations/ends_with/nonnull.cc: Likewise. * testsuite/21_strings/basic_string/operations/starts_with/nonnull.cc: Likewise. * testsuite/21_strings/basic_string/operators/char/1.cc: Cast unused results to void. * testsuite/21_strings/basic_string/operators/wchar_t/1.cc: Likewise. * testsuite/21_strings/basic_string_view/capacity/1.cc: Likewise. * testsuite/21_strings/basic_string_view/element_access/char/1.cc: Likewise. * testsuite/21_strings/basic_string_view/element_access/char/2.cc: Likewise. * testsuite/21_strings/basic_string_view/element_access/wchar_t/1.cc: Likewise. * testsuite/21_strings/basic_string_view/element_access/wchar_t/2.cc: Likewise. * testsuite/21_strings/basic_string_view/operations/contains/nonnull.cc: Likewise. Add -Wno-unused-result to options. * testsuite/21_strings/basic_string_view/operations/ends_with/nonnull.cc: Likewise. * testsuite/21_strings/basic_string_view/operations/starts_with/nonnull.cc: Likewise. * testsuite/27_io/basic_stringbuf/sputbackc/char/1.cc: Cast unused results to void. * testsuite/27_io/basic_stringbuf/sputbackc/wchar_t/1.cc: Likewise. * testsuite/27_io/basic_stringbuf/sungetc/char/1.cc: Likewise. * testsuite/27_io/basic_stringbuf/sungetc/wchar_t/1.cc: Likewise.
2022-08-28Daily bump.GCC Administrator1-0/+4
2022-08-27libstdc++: Add test for std::con/disjunction's base classPatrick Palka1-0/+34
libstdc++-v3/ChangeLog: * testsuite/20_util/logical_traits/requirements/base_classes.cc: New test.
2022-08-27Daily bump.GCC Administrator1-0/+66
2022-08-26libstdc++: Implement LWG 3692/3702 changes to zip_/zip_transform_viewPatrick Palka1-42/+1
libstdc++-v3/ChangeLog: * include/std/ranges (zip_view::_Iterator::operator<): Remove as per LWG 3692. (zip_view::_Iterator::operator>): Likewise. (zip_view::_Iterator::operator<=): Likewise. (zip_view::_Iterator::operator>=): Likewise. (zip_view::_Iterator::operator<=>): Remove three_way_comparable constraint as per LWG 3692. (zip_transform_view::_Iterator): Ditto as per LWG 3702.
2022-08-26libstdc++: Implement ranges::zip_transform_view from P2321R2Patrick Palka2-0/+449
libstdc++-v3/ChangeLog: * include/std/ranges (zip_view::_Iterator): Befriend zip_transform_view. (__detail::__range_iter_cat): Define. (zip_transform_view): Define. (zip_transform_view::_Iterator): Define. (zip_transform_view::_Sentinel): Define. (views::__detail::__can_zip_transform_view): Define. (views::_ZipTransform): Define. (views::zip_transform): Define. * testsuite/std/ranges/zip_transform/1.cc: New test.
2022-08-26libstdc++: Optimize std::con/disjunction, __and_/__or_, etcPatrick Palka1-59/+71
The internal type-level logical operator traits __and_ and __or_ seem to have high overhead for a couple of reasons: 1. They are drop-in replacements for std::con/disjunction, which are rigidly specified to form a type that derives from the first type argument that caused the overall computation to short-circuit. In practice this inheritance property seems to be rarely needed; usually all we care about is the value of the overall result. 2. Their recursive implementations instantiate O(N) class templates and form an inheritance chain of depth O(N). This patch gets rid of this inheritance property of __and_ and __or_ (which seems to be unneeded in the library except indirectly by std::con/disjunction) which allows us to redefine them non-recursively as alias templates that yield either false_type or true_type via enable_if_t and partial ordering of a pair of function templates (alternatively we could use an equivalent partially specialized class template, but using function templates appears to be slightly more efficient). As for std::con/disjunction, it seems we need to keep implementing them via a recursive class template for sake of the inheritance property. But instead of using inheritance recursion, use a recursive member typedef that gets immediately flattened, so that specializations thereof now have O(1) instead of O(N) inheritance depth. In passing, redefine __not_ as an alias template for consistency with __and_ and __or_, and to remove a layer of indirection. Together these changes have a substantial effect on compile time and memory usage for code that heavily uses these internal type traits. For the following example (which tests constructibility between two compatible 257-element tuple types): #include <tuple> #define M(x) x, x using ty1 = std::tuple<M(M(M(M(M(M(M(M(int)))))))), int>; using ty2 = std::tuple<M(M(M(M(M(M(M(M(int)))))))), long>; static_assert(std::is_constructible_v<ty2, ty1>); memory usage improves ~27% from 440MB to 320MB and compile time improves ~20% from ~2s to ~1.6s (with -std=c++23). libstdc++-v3/ChangeLog: * include/std/type_traits (enable_if, __enable_if_t): Define them earlier. (__detail::__first_t): Define. (__detail::__or_fn, __detail::__and_fn): Declare. (__or_, __and_): Redefine as alias templates in terms of __or_fn and __and_fn. (__not_): Redefine as an alias template. (__detail::__disjunction_impl, __detail::__conjunction_impl): Define. (conjuction, disjunction): Redefine in terms of __disjunction_impl and __conjunction_impl.
2022-08-26libstdc++: Simplify std::error_code and std::error_conditionJonathan Wakely3-25/+75
This removes the redundant operator=(E) from std::error_code and std::error_condition. Without that overload, assignment from a custom type will use the templated constructor to create a temporary and then use the trivial copy assignment operator. With the overloaded assignment, we have to check the constraints twice as often, because that overload and its constraints are checked for simple copy assignments (including the one in the overloaded assignment operator itself!) Also add tests that ADL is used as per LWG 3629. libstdc++-v3/ChangeLog: * include/std/system_error (error_code::_Check): New alias template for constructor SFINAE constraint. (error_code::error_code(ErrorCodeEnum)): Use it. (error_code::operator=(ErrorCodeEnum)): Remove. (error_condition::_Check): New alias template for constraint. (error_condition::error_condition(ErrorConditionEnum)): Use it. (error_condition::operator=(ErrorConditionEnum)): Remove. * testsuite/19_diagnostics/error_code/cons/1.cc: Check constructor taking user-defined error enum. * testsuite/19_diagnostics/error_condition/cons/1.cc: Likewise.
2022-08-26libstdc++: Add nonnull to starts_with/ends_with/contains string membersJonathan Wakely9-0/+81
Ideally this wouldn't be needed, because eventually these pointers all get passed to either the basic_string_view(const CharT*) constructor, or to basic_string_view::find(const CharT*), both of which already have the attribute. But for that to work requires optimization, so that the null value gets propagated through the call chain. Adding it explicitly to each member that requires a non-null pointer makes the diagnostics more reliable even without optimization. It's better to give a diagnostic earlier anyway, at the actual problematic call in the user's code. libstdc++-v3/ChangeLog: * include/bits/basic_string.h (starts_with, ends_with, contains): Add nonnull attribute. * include/bits/cow_string.h (starts_with, ends_with, contains): Likewise. * include/std/string_view (starts_with, ends_with, contains): Likewise. * testsuite/21_strings/basic_string/operations/contains/nonnull.cc * testsuite/21_strings/basic_string/operations/ends_with/nonnull.cc * testsuite/21_strings/basic_string/operations/starts_with/nonnull.cc * testsuite/21_strings/basic_string_view/operations/contains/nonnull.cc * testsuite/21_strings/basic_string_view/operations/ends_with/nonnull.cc * testsuite/21_strings/basic_string_view/operations/starts_with/nonnull.cc
2022-08-26Daily bump.GCC Administrator1-0/+9
2022-08-25libstdc++: Some minor <ranges> cleanupsPatrick Palka1-16/+4
libstdc++-v3/ChangeLog: * include/std/ranges (lazy_split_view::_OuterIter::_M_current): Remove redundant comment. (lazy_split_view::_M_current): Likewise. (common_view::common_view): Remove commented out view-converting constructor as per LWG3405. (elements_view::_Iterator::_Iterator): Uglify 'current' and 'i'.
2022-08-25Daily bump.GCC Administrator1-0/+57
2022-08-24libstdc++: Implement ranges::zip_view from P2321R2Patrick Palka4-53/+609
libstdc++-v3/ChangeLog: * include/bits/ranges_algo.h (__min_fn, min): Move to ... * include/bits/ranges_util.h: ... here, in order to avoid including all of ranges_algo.h from <ranges>. * include/std/ranges (__detail::__zip_is_common): Define for C++23 as per P2321R2. (__detail::__tuple_or_pair): Likewise. (__detail::__tuple_or_pair_t): Likewise. (__detail::__tuple_transform): Likewise. (__detail::__tuple_for_each): Likewise. (zip_view): Likewise. (enable_borrowed_range<zip_view>): Likewise. (__detail::__all_random_access): Likewise. (__detail::__all_bidirectional): Likewise. (__detail::__all_forward): Likewise. (__detail::__zip_view_iter_cat): Likewise. (zip_view::_Iterator): Likewise. (zip_view::_Sentinel): Likewise. * testsuite/std/ranges/zip/1.cc: New test.
2022-08-24Revert "libstdc++: Optimize operator+(string/char*, char*/string) equally"Jonathan Wakely2-23/+7
This reverts commit 0b7c9254998b3fb2c39f6b86b5b196f415530205.
2022-08-24libstdc++: Fix fallout from P2321R2 std::pair/tuple enhancementsPatrick Palka3-0/+56
r13-2159-g72886fcc626953 caused some testsuite regressions in C++23 mode: FAIL: 20_util/pair/requirements/explicit_instantiation/1.cc (test for excess errors) FAIL: 20_util/tuple/53648.cc (test for excess errors) FAIL: 20_util/tuple/cons/noexcept_specs.cc (test for excess errors) FAIL: 20_util/tuple/requirements/explicit_instantiation.cc (test for excess errors) The test noexcept_specs.cc just needs to be updated to consider the additional converting constructors of tuple in C++23 mode, which happen to improve constructing from a const tuple rvalue that has an rvalue reference element (for the better, as far as I can tell). The other three tests fail because they explicitly instantiate a specialization of pair/tuple whose elements are not all const swappable, which in C++23 mode now results in a hard error due to the new const swap member function. Rather than XFAILing the tests in C++23 mode, this patch adds non-standard constraints to this member function so that we continue to accept such explicit instantiations. libstdc++-v3/ChangeLog: * include/bits/stl_pair.h (pair::swap const): Add non-standard is_swappable_v constraints. * include/std/tuple (tuple::swap const): Likewise. * testsuite/20_util/tuple/cons/noexcept_specs.cc: Correct some asserts in C++23 mode.
2022-08-24libstdc++: Fix regression in std::stable_sortJonathan Wakely2-2/+54
The recent change to split out the cold path of std::stable_sort caused a regression for some Qt code. The problem is that the library now adds a value of type ptrdiff_t to the iterator, which is ambiguous with -pedantic. The addition could either convert the iterator to a built-in pointer and add the ptrdiff_t to that, or it could convert the ptrdiff_t to the iterator's difference_type and use the iterator's own operator+. The fix is to cast the ptrdiff_t value to the difference type first. libstdc++-v3/ChangeLog: * include/bits/stl_algo.h (__stable_sort): Cast size to iterator's difference type. * testsuite/25_algorithms/stable_sort/4.cc: New test.
2022-08-24libstdc++: Optimize operator+(string/char*, char*/string) equallyWill Hawkins2-7/+23
Until now operator+(char*, const string&) and operator+(const string&, char*) had different performance characteristics. The former required a single memory allocation and the latter required two. This patch makes the performance equal. libstdc++-v3/ChangeLog: * include/bits/basic_string.h (operator+(const string&, const char*)): Remove naive implementation. * include/bits/basic_string.tcc (operator+(const string&, const char*)): Add single-allocation implementation. Signed-off-by: Will Hawkins <whh8b@obs.cr>
2022-08-24libstdc++: Add check for LWG 3741 problem caseJonathan Wakely1-0/+5
This LWG issue was closed as NAD, as it was just a bug in an implementation, not a defect in the standard. Libstdc++ never had that bug and always worked for the problem case. Add a test to ensure we don't regress. The problem occurs when abs is implemented using a ternary expression: return d >= d.zero() ? d : -d; If decltype(-d) is not the same as decltype(d) then this is ambiguous, because each type can be converted to the other, so there is no common type. libstdc++-v3/ChangeLog: * testsuite/20_util/duration_cast/rounding.cc: Check abs with non-reduced duration.
2022-08-24Daily bump.GCC Administrator1-0/+52
2022-08-23libstdc++: Implement std::pair/tuple/misc enhancements from P2321R2Patrick Palka7-5/+1479
This implements the non-<ranges> changes from P2321R2, which primarily consist of additional converting constructors, assignment operator and swap overloads for std::pair and std::tuple. libstdc++-v3/ChangeLog: * include/bits/stl_bvector.h (_Bit_reference::operator=): Define const overload for C++23 as per P2321R2. * include/bits/stl_pair.h (pair::swap): Likewise. (pair::pair): Define additional converting constructors for C++23 as per P2321R2. (pair::operator=): Define const overloads for C++23 as per P2321R2. (swap): Define overload taking const pair& for C++23 as per P2321R2. (basic_common_reference): Define partial specialization for pair for C++23 as per P2321R2. (common_type): Likewise. * include/bits/uses_allocator_args.h (uses_allocator_construction_args): Define additional pair overloads for C++23 as per P2321R2. * include/std/tuple (_Tuple_impl::_Tuple_impl): Define additional converting constructors for C++23 as per P2321R2. (_Tuple_impl::_M_assign): Define const overloads for C++23 as per P2321R2. (_Tuple_impl::_M_swap): Likewise. (tuple::__constructible): Define as a convenient renaming of _TCC<true>::__constructible. (tuple::__convertible): As above but for _TCC<true>::__convertible. (tuple::tuple): Define additional converting constructors for C++23 as per P2321R2. (tuple::operator=): Define const overloads for C++23 as per P2321R2. (tuple::swap): Likewise. (basic_common_reference): Define partial specialization for tuple for C++23 as per P2321R2. (common_type): Likewise. * testsuite/20_util/pair/p2321r2.cc: New test. * testsuite/20_util/tuple/p2321r2.cc: New test. * testsuite/23_containers/vector/bool/element_access/1.cc: New test.
2022-08-23libstdc++: Separate construct/convertibility tests for std::tuplePatrick Palka1-4/+10
P2321R2 adds additional conditionally explicit constructors to std::tuple which we'll concisely implement in a subsequent patch using explicit(bool), like in our C++20 std::pair implementation. This prerequisite patch adds member typedefs to _TupleConstraints for testing element-wise constructibility and convertibility separately; we'll use the first in the new constructors' constraints, and the second in their explicit specifier. In passing, this patch also redefines the existing member predicates __is_ex/implicitly_constructible in terms of these new members. This seems to reduce compile time and memory usage by about 10% for large tuples when using the converting constructors that're constrained by _Explicit/_ImplicitCtor. libstdc++-v3/ChangeLog: * include/std/tuple (_TupleConstraints::__convertible): Define. (_TupleConstraints::__constructible): Define. (_TupleConstraints::__is_explicitly_constructible): Redefine this in terms of __convertible and __constructible. (_TupleConstraints::__is_implicitly_constructible): Likewise.
2022-08-23libstdc++: Fix visit<void>(v) for non-void visitors [PR106589]Jonathan Wakely2-1/+14
The optimization for the common case of std::visit forgot to handle the edge case of passing zero variants to a non-void visitor and converting the result to void. libstdc++-v3/ChangeLog: PR libstdc++/106589 * include/std/variant (__do_visit): Handle is_void<R> for zero argument case. * testsuite/20_util/variant/visit_r.cc: Check std::visit<void>(v).
2022-08-23Daily bump.GCC Administrator1-0/+28
2022-08-22libstdc++: Document linker option for C++23 <stacktrace> [PR105678]Jonathan Wakely4-7/+35
libstdc++-v3/ChangeLog: PR libstdc++/105678 * doc/xml/manual/using.xml: Document -lstdc++_libbacktrace requirement for using std::stacktrace. Also adjust -frtti and -fexceptions to document non-default (i.e. negative) forms. * doc/html/*: Regenerate.
2022-08-22libstdc++: Fix for explicit copy ctors in <thread> and <future> [PR106695]Jonathan Wakely4-3/+59
When I changed std::thread and std::async to avoid unnecessary move construction of temporaries, I introduced a regression where types with an explicit copy constructor could not be passed to std::thread or std::async. The fix is to add a constructor instead of using aggregate initialization of an unnamed temporary. libstdc++-v3/ChangeLog: PR libstdc++/106695 * include/bits/std_thread.h (thread::_State_impl): Forward individual arguments to _Invoker constructor. (thread::_Invoker): Add constructor. Delete copies. * include/std/future (__future_base::_Deferred_state): Forward individual arguments to _Invoker constructor. (__future_base::_Async_state_impl): Likewise. * testsuite/30_threads/async/106695.cc: New test. * testsuite/30_threads/thread/106695.cc: New test.
2022-08-22libstdc++: Check for overflow in regex back-reference [PR106607]Jonathan Wakely2-4/+31
Currently we fail to notice integer overflow when parsing a back-reference expression, or when converting the parsed result from long to int. This changes the result to be int, so no conversion is needed, and uses the overflow-checking built-ins to detect an out-of-range back-reference. libstdc++-v3/ChangeLog: PR libstdc++/106607 * include/bits/regex_compiler.tcc (_Compiler::_M_cur_int_value): Use built-ins to check for integer overflow in back-reference number. * testsuite/28_regex/basic_regex/106607.cc: New test.
2022-08-18Daily bump.GCC Administrator1-0/+4