aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3
AgeCommit message (Collapse)AuthorFilesLines
2025-05-17Daily bump.GCC Administrator1-0/+14
2025-05-16libstdc++: Use __is_invocable/nothrow_invocable builtins morePatrick Palka1-1/+18
As a follow-up to r15-1253 and r15-1254 which made us use these builtins in the standard std::is_invocable/nothrow_invocable class templates, let's also use them directly in the standard variable templates and our internal C++11 __is_invocable/nothrow_invocable class templates. libstdc++-v3/ChangeLog: * include/std/type_traits (__is_invocable): Define in terms of corresponding builtin if available. (__is_nothrow_invocable): Likewise. (is_invocable_v): Likewise. (is_nothrow_invocable_v): Likewise. Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
2025-05-16libstdc++: Fix proc check_v3_target_namedlocale for "" locale [PR65909]Jonathan Wakely1-4/+4
When the last format argument to a Tcl proc is named 'args' it has special meaning and is a list that accepts any number of arguments[1]. This means when "" is passed to the proc and then we expand "$args" we get an empty list formatted as "{}". My r16-537-g3e2b83faeb6b14 change broke all uses of dg-require-namedlocale with empty locale names, "". By changing the name of the formal argument to 'locale' we avoid the special behaviour for 'args' and now it only accepts a single argument (as was always intended). When expanded as "$locale" we get "" as I expected. [1] https://www.tcl-lang.org/man/tcl9.0/TclCmd/proc.html libstdc++-v3/ChangeLog: PR libstdc++/65909 * testsuite/lib/libstdc++.exp (check_v3_target_namedlocale): Change name of formal argument to locale. Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-05-16Daily bump.GCC Administrator1-0/+43
2025-05-15libstdc++: Fix class mandate for extents.Luc Grosheintz3-10/+15
The standard states that the IndexType must be a signed or unsigned integer. This mandate was implemented using `std::is_integral_v`. Which also includes (among others) char and bool, which neither signed nor unsigned integers. libstdc++-v3/ChangeLog: * include/std/mdspan: Implement the mandate for extents as signed or unsigned integer and not any interal type. Remove leading underscores from names in static_assert message. * testsuite/23_containers/mdspan/extents/class_mandates_neg.cc: Check that extents<char,...> and extents<bool,...> are invalid. Adjust dg-prune-output pattern. * testsuite/23_containers/mdspan/extents/misc.cc: Update tests to avoid `char` and `bool` as IndexType. Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com> Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
2025-05-15libstdc++: Fix std::format_kind primary template for Clang [PR120190]Jonathan Wakely2-10/+24
Although Clang trunk has been adjusted to handle our std::format_kind definition (because they need to be able to compile the GCC 15.1.0 release), it's probably better to not rely on something that they might start diagnosing again in future. Define the primary template in terms of an immediately invoked function expression, so that we can put a static_assert(false) in the body. libstdc++-v3/ChangeLog: PR libstdc++/120190 * include/std/format (format_kind): Adjust primary template to not depend on itself. * testsuite/std/format/ranges/format_kind_neg.cc: Adjust expected errors. Check more invalid specializations. Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com> Reviewed-by: Daniel Krügler <daniel.kruegler@gmail.com>
2025-05-15libstdc++: Micro-optimization in std::arg overload for scalarsJonathan Wakely1-2/+2
Use __builtin_signbit directly instead of std::signbit. libstdc++-v3/ChangeLog: * include/std/complex (arg(T)): Use __builtin_signbit instead of std::signbit. Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-05-15libstdc++: Deprecate non-standard std::fabs(const complex<T>&) [PR120235]Jonathan Wakely8-17/+40
There was an overload of fabs for std::complex in TR1 and in some C++0x drafts, but it was removed from the working draft by LWG 595. Since we've been providing it for decades we should deprecate it before removing it. libstdc++-v3/ChangeLog: PR libstdc++/120235 * doc/html/*: Regenerate. * doc/xml/manual/evolution.xml: Document deprecation. * include/std/complex: Replace references to TR1 subclauses with corresponding C++11 subclauses. (fabs): Add deprecated attribute. * testsuite/26_numerics/complex/fabs_neg.cc: New test. Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-05-15libstdc++: build testsuite with -WabiJason Merrill1-0/+1
I added this locally to check whether the PR120012 fix affects libstdc++ (it doesn't) but it seems more generally useful to catch whether compiler ABI changes have library impact. libstdc++-v3/ChangeLog: * testsuite/lib/libstdc++.exp: Add -Wabi.
2025-05-15libstdc++: Fix preprocessor check for __float128 formatter [PR119246]Tomasz Kamiński1-1/+1
The previous check `_GLIBCXX_FORMAT_F128 != 1` was passing if _GLIBCXX_FORMAT_F128 was not defined, i.e. evaluted to zero. This broke sparc-sun-solaris2.11 and x86_64-darwin. PR libstdc++/119246 libstdc++-v3/ChangeLog: * include/std/format: Updated check for _GLIBCXX_FORMAT_F128.
2025-05-15Daily bump.GCC Administrator1-0/+107
2025-05-14libstdc++: Renamed bits/move_only_function.h to bits/funcwrap.h [PR119125]Tomasz Kamiński5-23/+23
The file now includes copyable_function in addition to move_only_function. PR libstdc++/119125 libstdc++-v3/ChangeLog: * include/bits/move_only_function.h: Move to... * include/bits/funcwrap.h: ...here. * doc/doxygen/stdheader.cc (init_map): Replaced move_only_function.h with funcwrap.h, and changed include guard to use feature test macro. Move bits/version.h include before others. * include/Makefile.am: Likewise. * include/Makefile.in: Likewise. * include/std/functional: Likewise. Reviewed-by: Patrick Palka <ppalka@redhat.com> Reviewed-by: Jonathan Wakely <jwakely@redhat.com> Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-05-14libstdc++: Implement C++26 copyable_function [PR119125]Tomasz Kamiński15-4/+1262
This patch implements C++26 copyable_function as specified in P2548R6. It also implements LWG 4255 that adjust move_only_function so constructing from empty copyable_function, produces empty functor. This falls from existing checks, after specializing __is_polymorphic_function_v for copyable_function specializations. For compatible invoker signatures, the move_only_function may be constructed from copyable_funciton without double indirection. To achieve that we derive _Cpy_base from _Mo_base, and specialize __is_polymorphic_function_v for copyable_function. Similary copyable_functions with compatible signatures can be converted without double indirection. As we starting to use _Op::_Copy operation from the _M_manage function, invocations of that functions may now throw exceptions, so noexcept needs to be removed from the signature of stored _M_manage pointers. This also affects operations in _Mo_base, however we already wrap _M_manage invocations in noexcept member functions (_M_move, _M_destroy, swap). PR libstdc++/119125 libstdc++-v3/ChangeLog: * doc/doxygen/stdheader.cc: Addded cpyfunc_impl.h header. * include/Makefile.am: Add bits cpyfunc_impl.h. * include/Makefile.in: Add bits cpyfunc_impl.h. * include/bits/cpyfunc_impl.h: New file. * include/bits/mofunc_impl.h: Mention LWG 4255. * include/bits/move_only_function.h: Update header description and change guard to also check __glibcxx_copyable_function. (_Manager::_Func): Remove noexcept. (std::__is_polymorphic_function_v<move_only_function<_Tp>>) (__variant::_Never_valueless_alt<std::move_only_function<_Signature...>>) (move_only_function) [__glibcxx_move_only_function]: Adjust guard. (std::__is_polymorphic_function_v<copyable_function<_Tp>>) (__variant::_Never_valueless_alt<std::copyable_function<_Signature...>>) (__polyfunc::_Cpy_base, std::copyable_function) [__glibcxx_copyable_function]: Define. * include/bits/version.def: Define copyable_function. * include/bits/version.h: Regenerate. * include/std/functional: Define __cpp_lib_copyable_function. * src/c++23/std.cc.in (copyable_function) [__cpp_lib_copyable_function]: Export. * testsuite/20_util/copyable_function/call.cc: New test based on move_only_function tests. * testsuite/20_util/copyable_function/cons.cc: New test based on move_only_function tests. * testsuite/20_util/copyable_function/conv.cc: New test based on move_only_function tests. * testsuite/20_util/copyable_function/copy.cc: New test. * testsuite/20_util/copyable_function/move.cc: New test based on move_only_function tests. Reviewed-by: Jonathan Wakely <jwakely@redhat.com> Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-05-14libstdc++: Avoid double indirection in move_only_function when possible ↵Tomasz Kamiński5-154/+588
[PR119125] Based on the provision in C++26 [func.wrap.general] p2 this patch adjust the generic move_only_function(_Fn&&) constructor, such that when _Fn refers to selected move_only_function instantiations, the ownership of the target object is directly transfered to constructor object. This avoid cost of double indirection in this situation. We apply this also in C++23 mode. We also fix handling of self assignments, to match behavior required by standard, due use of copy and swap idiom. An instantiations MF1 of move_only_function can transfer target of another instantiation MF2, if it can be constructed via usual rules (__is_callable_from<_MF2>), and their invoker are convertible (__is_invoker_convertible<MF2, MF1>()), i.e.: * MF1 is less noexcept than MF2, * return types are the same after stripping cv-quals, * adujsted parameters type are the same (__poly::_param_t), i.e. param of types T and T&& are compatible for non-trivially copyable objects. Compatiblity of cv ref qualification is checked via __is_callable_from<_MF2>. To achieve above the generation of _M_invoke functions is moved to _Invoker class templates, that only depends on noexcept, return type and adjusted parameter of the signature. To make the invoker signature compatible between const and mutable qualified signatures, we always accept _Storage as const& and perform a const_cast for locally stored object. This approach guarantees that we never strip const from const object. Another benefit of this approach is that move_only_function<void(std::string)> and move_only_function<void(std::string&&)> use same funciton pointer, which should reduce binary size. The _Storage and _Manager functionality was also extracted and adjusted from _Mofunc_base, in preparation for implementation for copyable_function and function_ref. The _Storage was adjusted to store functions pointers as void(*)(). The manage function, now accepts _Op enum parameter, and supports additional operations: * _Op::_Address stores address of target object in destination * _Op::_Copy, when enabled, copies from source to destination Furthermore, we provide a type-independent mamange functions for handling all: * function pointer types * trivially copyable object stored locally. Similary as in case of invoker, we always pass source as const (for copy), and cast away constness in case of move operations, where we know that source is mutable. Finally, the new helpers are defined in __polyfunc internal namespace. PR libstdc++/119125 libstdc++-v3/ChangeLog: * include/bits/mofunc_impl.h: (std::move_only_function): Adjusted for changes in bits/move_only_function.h (move_only_function::move_only_function(_Fn&&)): Special case move_only_functions with same invoker. (move_only_function::operator=(move_only_function&&)): Handle self assigment. * include/bits/move_only_function.h (__polyfunc::_Ptrs) (__polyfunc::_Storage): Refactored from _Mo_func::_Storage. (__polyfunc::__param_t): Moved from move_only_function::__param_t. (__polyfunc::_Base_invoker, __polyfunc::_Invoke): Refactored from move_only_function::_S_invoke. (__polyfunc::_Manager): Refactored from _Mo_func::_S_manager. (std::_Mofunc_base): Moved into __polyfunc::_Mo_base with parts extracted to __polyfunc::_Storage and __polyfunc::_Manager. (__polyfunc::__deref_as, __polyfunc::__invoker_of) (__polyfunc::__base_of, __polyfunc::__is_invoker_convertible): Define. (std::__is_move_only_function_v): Renamed to __is_polymorphic_function_v. (std::__is_polymorphic_function_v): Renamed from __is_move_only_function_v. * testsuite/20_util/move_only_function/call.cc: Test for functions pointers. * testsuite/20_util/move_only_function/conv.cc: New test. * testsuite/20_util/move_only_function/move.cc: Tests for self assigment. Reviewed-by: Jonathan Wakely <jwakely@redhat.com> Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-05-14libstdc++: Preserve the argument type in basic_format_args [PR119246]Tomasz Kamiński3-107/+227
This commits adjust the way how the arguments are stored in the _Arg_value (and thus basic_format_args), by preserving the types of fixed width floating-point types, that were previously converted to float, double, long double. The _Arg_value union now contains alternatives with std::bfloat16_t, std::float16_t, std::float32_t, std::float64_t that use pre-existing _Arg_bf16, _Arg_f16, _Arg_f32, _Arg_f32 argument types. This does not affect formatting, as specialization of formatters for fixed width floating-point types formats them by casting to the corresponding standard floating point type. For the 128bit floating we need to handle the ppc64 architecture, (_GLIBCXX_LONG_DOUBLE_ALT128_COMPAT) for which the long double may (per TU basis) designate either __ibm128 and __ieee128 type, we need to store both types in the _Arg_value and have two _Arg_types (_Arg_ibm128, _Arg_ieee128). On other architectures we use extra enumerator value to store __float128, that is different from long double and _Float128. This is consistent with ppc64, for which __float128, if present, is same type as __ieee128. We use _Arg_float128 _M_float128 names that deviate from _Arg_fN naming scheme, to emphasize that this flag is not used for std::float128_t (_Float128) type, that is consistenly formatted via handle. The __format::__float128_t type is renamed to __format::__flt128_t, to mitigate visual confusion between this type and __float128. We also introduce __bflt16_t typedef instead of using of decltype. We add new alternative for the _Arg_value and allow them to be accessed via _S_get, when the types are available. However, we produce and handle corresponding _Arg_type, only when we can format them. See also r14-3329-g27d0cfcb2b33de. The formatter<_Float128, _CharT> that formats via __format::__flt128_t is always provided, when type is available. It is still correct when __format::__flt128_t is _Float128. We also provide formatter<__float128, _CharT> that formats via __flt128_t. As this type may be disabled (-mno-float128), extra care needs to be taken, for situation when __float128 is same as long double. If the formatter would be defined in such case, the formatter<long double, _CharT> would be generated from different specializations, and have different mangling: * formatter<__float128, _CharT> if __float128 is present, * formatter<__format::__formattable_float, _CharT> otherwise. To best of my knowledge this happens only on ppc64 for __ieee128 and __float128, so the formatter is not defined in this case. static_assert is added to detect other configurations like that. In such case we should replace it with constraint. PR libstdc++/119246 libstdc++-v3/ChangeLog: * include/std/format (__format::__bflt16_t): Define. (_GLIBCXX_FORMAT_F128): Separate value for cases where _Float128 is used. (__format::__float128_t): Renamed to __format::__flt128_t. (std::formatter<_Float128, _CharT>): Define always if there is formattable 128bit float. (std::formatter<__float128, _CharT>): Define. (_Arg_type::_Arg_f128): Rename to _Arg_float128 and adjust value. (_Arg_type::_Arg_ibm128): Change value to _Arg_ldbl. (_Arg_type::_Arg_ieee128): Define as alias to _Arg_float128. (_Arg_value::_M_f128): Replaced with _M_ieee128 and _M_float128. (_Arg_value::_M_ieee128, _Arg_value::_M_float128) (_Arg_value::_M_bf16, _Arg_value::_M_f16, _Arg_value::_M_f32) (_Arg_value::_M_f64): Define. (_Arg_value::_S_get, basic_format_arg::_S_to_enum): Handle __bflt16, _Float16, _Float32, _Float64, and __float128 types. (basic_format_arg::_S_to_arg_type): Preserve _bflt16, _Float16, _Float32, _Float64 and __float128 types. (basic_format_arg::_M_visit): Handle _Arg_float128, _Arg_ieee128, _Arg_b16, _Arg_f16, _Arg_f32, _Arg_f64. * testsuite/std/format/arguments/args.cc: Updated to illustrate that extended floating point types use handles now. Added test for __float128. * testsuite/std/format/parse_ctx.cc: Extended test to cover class to check_dynamic_spec with floating point types and handles. Reviewed-by: Jonathan Wakely <jwakely@redhat.com> Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-05-14Add std::to_underlying to the set of stdlib functions that are always foldedVille Voutilainen1-1/+1
gcc/cp/ChangeLog: * cp-gimplify.cc (cp_fold): Add to_underlying. gcc/testsuite/ChangeLog: * g++.dg/opt/pr96780_cpp23.C: New. libstdc++-v3/ChangeLog: * include/std/utility (to_underlying): Add the __always_inline__ attribute. Signed-off-by: Ville Voutilainen <ville.voutilainen@gmail.com>
2025-05-13Daily bump.GCC Administrator1-0/+72
2025-05-12GCN, nvptx libstdc++: Force use of '__atomic' builtins: revert ↵Thomas Schwinge1-11/+0
'atomicity_dir=cpu/generic/atomicity_builtins' hard-coding [PR119645]" Thanks to commit 86627faec10da53d7532805019e5296fcf15ac09 "libstdc++: Rewrite atomic builtin checks [PR70560]", for both GCN, nvptx we now get: +configure:16060: checking for atomic builtins for _Atomic_word +[...] +configure:16073: result: yes ..., and thus may revert the 'atomicity_dir=cpu/generic/atomicity_builtins' hard-coding added in commit 059b5509c14904b55c37f659170240ae0d2c1c8e "GCN, nvptx libstdc++: Force use of '__atomic' builtins [PR119645]". PR target/119645 libstdc++-v3/ * configure.host [GCN, nvptx] (atomicity_dir): Don't set.
2025-05-12libstdc++: Fix constraint recursion in std::expected's operator== [PR119714]Patrick Palka2-2/+11
This std::expected friend operator== is prone to constraint recursion after CWG 2369 for the same reason as basic_const_iterator's comparison operators were before the r15-7757-g4342c50ca84ae5 workaround. This patch works around the constraint recursion here in a similar manner, by making the function parameter of type std::expected dependent in a trivial way. PR libstdc++/119714 PR libstdc++/112490 libstdc++-v3/ChangeLog: * include/std/expected (expected::operator==): Replace non-dependent std::expected function parameter with a dependent one of type expected<_Vp, _Er> where _Vp matches _Tp. * testsuite/20_util/expected/119714.cc: New test. Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com> Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
2025-05-12libstdc++: Remove #warning from <ciso646> for C++17 [PR120187]Jonathan Wakely7-8/+26
Although <ciso646> was removed from C++20, it was not formally deprecated in C++17. In contrast, <ctgmath>, <cstdalign>, etc. were formally deprecated in C++17 before being removed in C++20. Due to the widespread convention of including <ciso646> to detect implementation-specific macros (such as _GLIBCXX_RELEASE) it causes quite a lot of noise to issue deprecation warnings in C++17 mode. The recommendation to include <version> instead does work for recent compilers, even in C++17 mode, but isn't portable to older compilers that don't provide <version> yet (e.g. GCC 8). There are also potential objections to including <version> pre-C++20 when it wasn't defined by the standard. I don't have much sympathy for this position, because including <ciso646> for implementation-specific macros wasn't part of the C++17 standard either. It's no more non-standard to rely on <version> being present and defining those macros than to rely on <ciso646> defining them, and __has_include can be used to detect whether <version> is present. However, <ciso646> is being used in the wild by popular libraries like Abseil and we can't change versions of those that have already been released. This removes the #warning in <ciso646> for C++17 mode, so that we only emit diagnostics for C++20 and later. With this change, including <ciso646> in C++20 or later gives an error if _GLIBCXX_USE_DEPRECATED is defined to zero, otherwise a warning if -Wdeprecated is enabled, otherwise no diagnostic is given. This also adds "@since C++11 (removed in C++20)" to the Doxygen @file comments in all the relevant headers. The test for <ciso646> needs to be updated to no longer expect a warning for c++17_only. A new test is added to ensure that we get a warning instead of an error when -D_GLIBCXX_USE_DEPRECATED=0 is not used. libstdc++-v3/ChangeLog: PR libstdc++/120187 * include/c_global/ciso646: Only give deprecated warning for C++20 and later. * include/c_global/ccomplex: Add @since to Doxygen comment. * include/c_global/cstdalign: Likewise. * include/c_global/cstdbool: Likewise. * include/c_global/ctgmath: Likewise. * testsuite/18_support/headers/ciso646/macros.cc: Remove dg-warning for c++17_only effective target. * testsuite/18_support/headers/ciso646/macros-2.cc: New test. Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-05-12libstdc++: Update C++23 status tableJonathan Wakely2-40/+45
This should have been updated for the GCC 15.1 release. libstdc++-v3/ChangeLog: * doc/xml/manual/status_cxx2023.xml: Update status of proposals implemented after GCC 14.2 release. * doc/html/manual/status.html: Regenerate.
2025-05-12libstdc++: Restore std::scoped_lock for non-gthreads targets [PR120198]Jonathan Wakely4-8/+26
This was a regression introduced with using version.def to define feature test macros (r14-3248-g083b7f2833d71d). std::scoped_lock doesn't need to depend on gthreads and so can be defined unconditionally, even for freestanding. libstdc++-v3/ChangeLog: PR libstdc++/120198 * include/bits/version.def (scoped_lock): Do not depend on gthreads or hosted. * include/bits/version.h: Regenerate. * include/std/mutex (scoped_lock): Update comment. * testsuite/30_threads/scoped_lock/requirements/typedefs.cc: Remove dg-require-gthreads and use custom lockable type instead of std::mutex. Check that typedef is only present for a single template argument. Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-05-12libstdc++: Rewrite atomic builtin checks: Fix up 'GLIBCXX_ENABLE_BACKTRACE' ↵Thomas Schwinge2-4/+4
check with 'size_t' [PR119667] Fix-up for commit 86627faec10da53d7532805019e5296fcf15ac09 "libstdc++: Rewrite atomic builtin checks [PR70560]", which, for example, for x86_64-pc-linux-gnu lost '-DHAVE_ATOMIC_FUNCTIONS=1' from 'BACKTRACE_CPPFLAGS' due to: configure:53554: checking for atomic builtins for libbacktrace configure:53587: [...]/./gcc/xgcc -shared-libgcc -B[...]/./gcc -nostdinc++ -L[...]/x86_64-pc-linux-gnu/libstdc++-v3/src -L[...]/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs -L[...]/x86_64-pc-linux-gnu/libstdc++-v3/libsupc++/.libs -B/x86_64-pc-linux-gnu/bin/ -B/x86_64-pc-linux-gnu/lib/ -isystem /x86_64-pc-linux-gnu/include -isystem /x86_64-pc-linux-gnu/sys-include -o conftest -O0 conftest.cpp >&5 conftest.cpp: In function 'int main()': conftest.cpp:265:13: error: 'size_t' was not declared in this scope 265 | size_t s = 0; | ^~~~~~ conftest.cpp:1:1: note: 'size_t' is defined in header '<cstddef>'; this is probably fixable by adding '#include <cstddef>' 1 | /* confdefs.h */ conftest.cpp:273:31: error: 's' was not declared in this scope 273 | __atomic_store_n(&s, s, __ATOMIC_RELEASE); | ^ configure:53587: $? = 1 configure: failed program was: | /* confdefs.h */ [...] | int | main () | { |[...] | size_t s = 0; |[...] | // backtrace_atomic_store_size_t | __atomic_store_n(&s, s, __ATOMIC_RELEASE); |[...] | } configure:53595: result: no PR libstdc++/70560 PR libstdc++/119667 libstdc++-v3/ * acinclude.m4 (GLIBCXX_ENABLE_BACKTRACE): Use '__SIZE_TYPE__' instead of 'size_t'. * configure: Regenerate.
2025-05-12libstdc++: Suppress GDB output from new 'skip' commands [PR118260]Jonathan Wakely1-4/+8
I added some gdb.execute('skip -rfu ...') commands to the Python hook loaded with libstdc++.so but this makes GDB print output like: Function(s) ^std::(move|forward|as_const|(__)?addressof) will be skipped when stepping. This probably aren't interesting to users, so this change suppresses that output by capturing the output into the gdb.execute return value (which is then ignored). An exception is thrown if the gdb.execute command fails, so this doesn't suppress any errors which might be meaningful to users or libstdc++ developers. libstdc++-v3/ChangeLog: PR libstdc++/118260 * python/hook.in: Suppress output from gdb.execute calls to register skips. Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-05-12libstdc++: Update <charconv> rows in C++17 status tableJonathan Wakely3-6/+38
Document that std::to_chars and std::from_chars are complete, mentioning the libraries used for floating-point types. libstdc++-v3/ChangeLog: * doc/xml/manual/status_cxx2017.xml: Update status for std::to_chars and std::from_chars. * doc/html/manual/*: Regenerate. Reviewed-by: Jakub Jelinek <jakub@redhat.com> Reviewed-by: Björn Schäpers <gcc@hazardy.de>
2025-05-12libstdc++: Make dg-require-namedlocale work for more targets [PR65909]Jonathan Wakely1-9/+4
As noted in the PR, some embedded targets do not support command-line arguments, which means that the dg-require-namedlocale check always fails. Use Sandra's suggestion of hardcoding the argument into the executable instead of passing it as a command-line argument. Realistically, those embedded targets probably don't support the named locales anyway, but at least now the tests will be UNSUPPORTED for the right reason. libstdc++-v3/ChangeLog: PR libstdc++/65909 * testsuite/lib/libstdc++.exp (check_v3_target_namedlocale): Hardcode the locale name instead of passing it to the executable. Do not hardcode buffer size for string. Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-05-11Daily bump.GCC Administrator1-0/+4
2025-05-10vxworks: libstdc++: include ioLib.h for dup()Alexandre Oliva1-0/+4
vxworks's dup function is not declared in unistd.h, but c++23/print.cc expects to be able to call it if unistd.h is available. On vxworks, the function is only declared in ioLib.h, so arrange to include it. for libstdc++-v3/ChangeLog * src/c++23/print.cc [__VXWORKS__]: Include ioLib.h.
2025-05-10Daily bump.GCC Administrator1-0/+20
2025-05-09libstdc++: Use _Padding_sink in __formatter_chrono to produce padded output.Tomasz Kamiński1-35/+20
Formatting code is extracted to _M_format_to function, that produced output to specified iterator. This function is now invoked either with __fc.out() directly (if width is not specified) or _Padding_sink::out(). This avoid formatting to temporary string if no padding is requested, and minimize allocations otherwise. For more details see commit message of r16-142-g01e5ef3e8b91288f5d387a27708f9f8979a50edf. This should not increase number of instantiations, as implementation only produce basic_format_context with _Sink_iter as iterator, which is also _Padding_sink iterator. libstdc++-v3/ChangeLog: * include/bits/chrono_io.h (__formatter_chrono::_M_format_to): Extracted from _M_format. (__formatter_chrono::_M_format): Use _Padding_sink and delegate to _M_format_to. Reviewed-by: Jonathan Wakely <jwakely@redhat.com> Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-05-09libstdc++: Provide ability to query _Sink_iter if writes are discarded.Tomasz Kamiński1-12/+52
This patch provides _M_discarding functiosn for _Sink_iter and _Sink function that returns true, if any further writes to the _Sink_iter and underlying _Sink, will be discared, and thus can be omitted. Currently only the _Padding_sink reports discarding mode of if width of sequence characters is greater than _M_maxwidth (precision), or underlying _Sink is discarding characters. The _M_discarding override, is separate function from _M_ignoring, that remain annotated with [[__gnu__::__always_inline__]]. Despite having notion of maximum characters to be written (_M_max), _Iter_sink nevers discard characters, as the total number of characters that would be written needs to be returned by format_to_n. This is documented in-source by providing an _Iter_sink::_M_discarding override, that always returns false. The function is currently queried only by the _Padding_sinks, that may be stacked for example a range is formatted, with padding with being specified both for range itself and it's elements. The state of underlying sink is checked during construction and after each write (_M_sync_discarding). libstdc++-v3/ChangeLog: * include/std/format (__Sink_iter<_CharT>::_M_discarding) (__Sink<_CharT>::_M_discarding, _Iter_sink<_CharT, _OutIter>::_M_discarding) (_Padding_sinl<_CharT, _Out>::_M_padwidth) (_Padding_sink<_CharT, _Out>::_M_maxwidth): Remove const. (_Padding_sink<_CharT, _Out>::_M_sync_discarding) (_Padding_sink<_CharT, _Out>::_M_discarding): Define. (_Padding_sink<_CharT, _Out>::_Padding_sink(_Out, size_t, size_t)) (_Padding_sink<_CharT, _Out>::_M_force_update): (_Padding_sink<_CharT, _Out>::_M_flush): Call _M_sync_discarding. (_Padding_sink<_CharT, _Out>::_Padding_sink(_Out, size_t)): Delegate. Reviewed-by: Jonathan Wakely <jwakely@redhat.com> Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-05-08Daily bump.GCC Administrator1-0/+51
2025-05-07libstdc++: Add missing export for std::is_layout_compatible_v [PR120159]Jonathan Wakely1-0/+1
libstdc++-v3/ChangeLog: PR libstdc++/120159 * src/c++23/std.cc.in (is_layout_compatible_v): Export.
2025-05-07libstdc++: Fix module std export for std::extentsJonathan Wakely1-0/+3
libstdc++-v3/ChangeLog: * src/c++23/std.cc.in: Fix export for std::extents.
2025-05-07libstdc++: Add tests for std::extents.Luc Grosheintz6-0/+623
A prior commit added std::extents, this commit adds the tests. The bulk is focussed on testing the constructors. These are split into three groups: 1. the ctor from other extents and the copy ctor, 2. the ctor from a pack of integer-like objects, 3. the ctor from shapes, i.e. span and array. For each group check that the ctor: * produces an object with the expected values for extent, * is implicit if and only if required, * is constexpr, * doesn't change the rank of the extent. libstdc++-v3/ChangeLog: * testsuite/23_containers/mdspan/extents/class_mandates_neg.cc: New test. * testsuite/23_containers/mdspan/extents/ctor_copy.cc: New test. * testsuite/23_containers/mdspan/extents/ctor_ints.cc: New test. * testsuite/23_containers/mdspan/extents/ctor_shape.cc: New test. * testsuite/23_containers/mdspan/extents/custom_integer.cc: New test. * testsuite/23_containers/mdspan/extents/misc.cc: New test. Signed-off-by: Luc Grosheintz <luc.grosheintz@gmail.com>
2025-05-07libstdc++: Implement std::extents [PR107761].Luc Grosheintz2-1/+266
This implements std::extents from <mdspan> according to N4950 and contains partial progress towards PR107761. If an extent changes its type, there's a precondition in the standard, that the value is representable in the target integer type. This precondition is not checked at runtime. The precondition for 'extents::{static_,}extent' is that '__r < rank()'. For extents<T> this precondition is always violated and results in calling __builtin_trap. For all other specializations it's checked via __glibcxx_assert. PR libstdc++/107761 libstdc++-v3/ChangeLog: * include/std/mdspan (extents): New class. * src/c++23/std.cc.in: Add 'using std::extents'. Signed-off-by: Luc Grosheintz <luc.grosheintz@gmail.com>
2025-05-07libstdc++: Add header mdspan to the build-system.Luc Grosheintz5-0/+52
Creates a nearly empty header mdspan and adds it to the build-system and Doxygen config file. libstdc++-v3/ChangeLog: * doc/doxygen/user.cfg.in: Add <mdspan>. * include/Makefile.am: Ditto. * include/Makefile.in: Ditto. * include/precompiled/stdc++.h: Ditto. * include/std/mdspan: New file. Signed-off-by: Luc Grosheintz <luc.grosheintz@gmail.com>
2025-05-07libstdc++: Setup internal FTM for mdspan.Luc Grosheintz2-0/+18
Uses the FTM infrastructure to create an internal feature testing macro for partial availability of mdspan; which is then used to hide the contents of the header mdspan when compiling against a standard prior to C++23. libstdc++-v3/ChangeLog: * include/bits/version.def: Add internal feature testing macro __glibcxx_mdspan. * include/bits/version.h: Regenerate. Signed-off-by: Luc Grosheintz <luc.grosheintz@gmail.com>
2025-05-07libstdc++: Fix width computation for the chrono formatting [PR120114]Tomasz Kamiński2-2/+132
Use `__unicode::_field_width` to compute the field width of the output when writting the formatted output for std::chrono::types. This applies both to characters copied from format string, and one produced by localized formatting. We also use _Str_sink::view() instead of get(), which avoids copying the content of the buffer to std::string in case of small output. PR libstdc++/120114 libstdc++-v3/ChangeLog: * include/bits/chrono_io.h (__formatter_chrono::_M_format): Use __field_width. * testsuite/std/time/format/pr120114.cc: New test. Reviewed-by: Jonathan Wakely <jwakely@redhat.com> Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-05-07libstdc++: Remove use of undefined GLIBCXX_LANG_{PUSH,POP} [PR120147]Jonathan Wakely2-6/+20
Commit r16-427-g86627faec10da5 was using the new GLIBCXX_LANG_PUSH and GLIBCXX_LANG_POP macros from a change that I haven't pushed yet, resulting in changes to CXXFLAGS not being restored after the GLIBCXX_ENABLE_BACKTRACE checks. libstdc++-v3/ChangeLog: PR libstdc++/120147 * acinclude.m4 (GLIBCXX_ENABLE_BACKTRACE): Restore use of AC_LANG_CPLUSPLUS. * configure: Regenerate.
2025-05-07Daily bump.GCC Administrator1-0/+53
2025-05-06libstdc++: Rewrite atomic builtin checks [PR70560]Jonathan Wakely5-489/+244
Currently the GLIBCXX_ENABLE_ATOMIC_BUILTINS macro checks for a variety of __atomic built-ins for bool, short and int. If all those checks pass, then it defines _GLIBCXX_ATOMIC_BUILTINS and uses the definitions from config/cpu/generic/atomicity_builtins/atomicity.h for the non-inline versions of __exchange_and_add and __atomic_add that get compiled into libsupc++. However, the config/cpu/generic/atomicity_builtins/atomicity.h definitions only depend on __atomic_fetch_add not on __atomic_test_and_set or __atomic_compare_exchange. And they only operate on a variable of type _Atomic word, which is not necessarily one of bool, short or int (e.g. for sparcv9 _Atomic_word is 64-bit long). This means that for a target where _Atomic_word is int but there are no 1-byte or 2-byte atomic instructions, GLIBCXX_ENABLE_ATOMIC_BUILTINS will fail the checks for bool and short and not define the macro _GLIBCXX_ATOMIC_BUILTINS. That means that we will use a single global mutex for reference counting in the COW std::string and std::locale, even though we could use __atomic_fetch_add to do it lock-free. This commit removes most of the GLIBCXX_ENABLE_ATOMIC_BUILTINS checks, so that it only checks __atomic_fetch_add on _Atomic_word. The macro defined by GLIBCXX_ENABLE_ATOMIC_BUILTINS is renamed from _GLIBCXX_ATOMIC_BUILTINS to _GLIBCXX_ATOMIC_WORD_BUILTINS to better reflect what it really means. This will enable the inline versions of __exchange_and_add and __atomic_add for more targets. This is not an ABI change, because targets which didn't previously use the inline definitions of those functions made non-inlined calls to the functions in the library. If the definitions of those functions now start using atomics, that doesn't change the semantics for the code calling those functions. On affected targets, new code compiled after this change will see the _GLIBCXX_ATOMIC_WORD_BUILTINS macro and so will use the always-inline versions of __exchange_and_add and __atomic_add, which use __atomic_fetch_add directly. That is also compatible with older code which still calls the non-inline definitions, because those non-inline definitions now also use __atomic_fetch_add. The only configuration where this could be an ABI change is for a target which previously defined _GLIBCXX_ATOMIC_BUILTINS (because all the atomic built-ins for bool, short and int are supported), but which defines _Atomic_word to some other type for which __atomic_fetch_add is /not/ supported. Such a target would have called the inline functions using __atomic_fetch_add, which would actually have depended on libatomic (which is what the configure checks were supposed to prevent!). After this change, that target would not define the new macro, _GLIBCXX_ATOMIC_WORD_BUILTINS, and so would make non-inline calls into the library where __exchange_and_add and __atomic_add would use the global mutex. That would be an ABI break. I don't consider that a realistic scenario, because it wouldn't have made any sense to define _Atomic_word to a wider type than int, when doing so would have required libatomic to make libstdc++.so work. Surely such a target would have just used int for its _Atomic_word type. The GLIBCXX_ENABLE_BACKTRACE macro currently uses the glibcxx_ac_atomic_int variable defined by the checks that this commit removes from GLIBCXX_ENABLE_ATOMIC_BUILTINS. That wasn't a good check anyway, because libbacktrace actually depends on atomic loads+stores for pointers as well as int, and for atomic stores for size_t. This commit replaces the glibcxx_ac_atomic_int check with a proper test for all the required atomic operations on all three of int, void* and size_t. This ensures that the libbacktrace code used for std::stacktrace will either use native atomics, or implement those loads and stores only in terms of __sync_bool_compare_and_swap (possibly requiring that to come from libatomic or elsewhere). libstdc++-v3/ChangeLog: PR libstdc++/70560 PR libstdc++/119667 * acinclude.m4 (GLIBCXX_ENABLE_ATOMIC_BUILTINS): Only check for __atomic_fetch_add on _Atomic_word. Define new macro _GLIBCXX_ATOMIC_WORD_BUILTINS and stop defining macro _GLIBCXX_ATOMIC_BUILTINS. (GLIBCXX_ENABLE_BACKTRACE): Check for __atomic_load_n and __atomic_store_n on int, void* and size_t. * config.h.in: Regenerate. * configure: Regenerate. * configure.host: Fix typo in comment. * include/ext/atomicity.h (__exchange_and_add, __atomic_add): Depend on _GLIBCXX_ATOMIC_WORD_BUILTINS macro instead of old _GLIBCXX_ATOMIC_BUILTINS macro.
2025-05-06libstdc++: Fix <numeric> parallel algos for move-only values [PR117905]Jonathan Wakely5-54/+119
All of reduce, transform_reduce, exclusive_scan, and inclusive_scan, transform_exclusive_scan, and transform_inclusive_scan have a precondition that the type of init meets the Cpp17MoveConstructible requirements. It isn't required to be copy constructible, so when passing it to the next internal function it needs to be moved, not copied. We also need to move when creating local variables on the stack, and when returning as part of a pair. libstdc++-v3/ChangeLog: PR libstdc++/117905 * include/pstl/glue_numeric_impl.h (reduce, transform_reduce) (transform_reduce, inclusive_scan, transform_exclusive_scan) (transform_inclusive_scan): Use std::move for __init parameter. * include/pstl/numeric_impl.h (__brick_transform_reduce) (__pattern_transform_reduce, __brick_transform_scan) (__pattern_transform_scan): Likewise. * include/std/numeric (inclusive_scan, transform_exclusive_scan): Use std::move to create local copy of the first element. * testsuite/26_numerics/pstl/numeric_ops/108236.cc: Move test using move-only type to ... * testsuite/26_numerics/pstl/numeric_ops/move_only.cc: New test.
2025-05-06libstdc++: Fix dangling pointer in fs::path::operator+=(*this) [PR120029]Jonathan Wakely3-0/+156
When concatenating a path we reallocate the left operand's storage to make room for the new components being added. When the two operands are the same object, or the right operand is one of the components of the left operand, the reallocation invalidates the pointers that refer into the right operand's storage. The solution in this commit is to detect these aliasing cases and just do the concatenation in terms of the contained string, as that code already handles the case where the string aliases the path. The standard specifies the concatenation in terms of the native() string, so all this change does is disable the optimized implementation of concatenation for path objects which attempts to avoid re-parsing the path from the concatenated string. The potential loss of performance for this case isn't likely to be an issue, because concatenating a path with itself (or one of its existing components) probably isn't a common use case. The Filesystem TS implementation doesn't have the optimized form of concatenation and always does it in terms of the native string and reparsing the whole thing, so doesn't have this bug. A test is added to confirm that anyway (that test has some slightly different results due to different behaviour for trailing slashes and implicit "." filenames in the TS spec). libstdc++-v3/ChangeLog: PR libstdc++/120029 * src/c++17/fs_path.cc (path::operator+=(const path&)): Handle parameters that alias the path or one of its components. * testsuite/27_io/filesystem/path/concat/120029.cc: New test. * testsuite/experimental/filesystem/path/concat/120029.cc: New test.
2025-05-06libstdc++: Fix -Wmismatched-tags warnings for _Safe_iterator [PR120112]Jonathan Wakely2-2/+2
This causes an ICE as shown in the PR, but it should be fixed in the library code anyway. libstdc++-v3/ChangeLog: PR c++/120112 * include/bits/ptr_traits.h (_Safe_iterator_base): Use class keyword in class-head of declaration. * include/debug/debug.h (_Safe_iterator): Likewise.
2025-05-06libstdc++: Add noexcept to some std::counted_iterator operationsJonathan Wakely1-6/+6
This was inspired by LWG 4245 but goes further. Anything which only reads or writes the _M_length member can be noexcept. That member is an iterator difference_type which means it's a signed integer type or the __max_diff_type integer-like class type, so all arithmetic and comparisons are non-throwing. libstdc++-v3/ChangeLog: * include/bits/stl_iterator.h (counted_iterator): Add noexcept to friend operators which only access the _M_length member. Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-05-03Daily bump.GCC Administrator1-0/+25
2025-05-02libstdc++: Add missing feature-test macro in <memory>Dhruv Chawla2-0/+5
Per version.syn#2, <memory> is required to define __cpp_lib_addressof_constexpr as 201603L. Bootstrapped and tested on aarch64-linux-gnu. Signed-off-by: Dhruv Chawla <dhruvc@nvidia.com> libstdc++-v3/ChangeLog: * include/std/memory: Define __glibcxx_want_addressof_constexpr. * testsuite/20_util/headers/memory/version.cc: Test for macro value.
2025-05-02libstdc++: Make __gnu_test::default_init_allocator usable in constexprJonathan Wakely3-7/+32
If we make this test allocator usable in constant expressions then we'll get an error if the 'state' data member isn't initialized. This makes it a more reliable check that allocators are correctly value-initialized when they're required to be. libstdc++-v3/ChangeLog: * testsuite/23_containers/vector/allocator/default_init.cc: Add a check using constant evaluation. * testsuite/23_containers/vector/bool/allocator/default_init.cc: Likewise. * testsuite/util/testsuite_allocator.h (default_init_allocator): Make all member functions and equality ops constexpr.
2025-05-02libstdc++: Add some more makefile dependenciesJonathan Wakely4-13/+35
Add more prerequisites for wchar and dual-abi targets in the src/c++11 directory, and simplify the existing ones (we don't need to add the main xxx.cc source file as a prerequisite of xxx.o because that's implicit, we only need to add the ones that Make can't determine on its own). Also add similar prerequisites for the dual-abi targets in the src/c++17 directory. libstdc++-v3/ChangeLog: * src/c++11/Makefile.am: Simplify existing prerequisites for wchar and dual-abi targets that are built from other sources. Add similar prerequisites for more wchar and dual-abi files. * src/c++11/Makefile.in: Regenerate. * src/c++17/Makefile.am [ENABLE_DUAL_ABI]: Add prerequisites for dual-abi targets that are built from other sources. * src/c++17/Makefile.in: Regenerate.