aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3
AgeCommit message (Collapse)AuthorFilesLines
2025-06-11libstdc++: Fix new <sstream> tests for COW std::string ABIJonathan Wakely4-0/+24
The std::basic_stringbuf::get_allocator() member is only available for the SSO std::string ABI. libstdc++-v3/ChangeLog: * testsuite/27_io/basic_istringstream/cons/char/string_view.cc: Only check get_allocator() for new string ABI. * testsuite/27_io/basic_ostringstream/cons/char/string_view.cc: Likewise. * testsuite/27_io/basic_stringbuf/cons/char/string_view.cc: Likewise. * testsuite/27_io/basic_stringstream/cons/char/string_view.cc: Likewise. Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-06-11Daily bump.GCC Administrator1-0/+18
2025-06-10libstdc++: Make __max_size_type and __max_diff_type structuralPatrick Palka2-2/+9
This patch makes these integer-class types structural types by public-izing their data members so that they could be used as NTTP types. I don't think this is required by the standard, but it seems like a useful extension. libstdc++-v3/ChangeLog: * include/bits/max_size_type.h (__max_size_type::_M_val): Make public instead of private. (__max_size_type::_M_msb): Likewise. (__max_diff_type::_M_rep): Likewise. * testsuite/std/ranges/iota/max_size_type.cc: Verify __max_diff_type and __max_size_type are structural. Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com> Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
2025-06-10libstdc++: Implement LWG3528 make_from_tuple can perform (the equivalent of) ↵Yihan Wang2-2/+68
a C-style cast Implement LWG3528 to make std::make_from_tuple SFINAE friendly. libstdc++-v3/ChangeLog: * include/std/tuple (__can_make_from_tuple): New variable template. (__make_from_tuple_impl): Add static_assert. (make_from_tuple): Constrain using __can_make_from_tuple. * testsuite/20_util/tuple/dr3528.cc: New test. Signed-off-by: Yihan Wang <yronglin777@gmail.com> Co-authored-by: Jonathan Wakely <jwakely@redhat.com> Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-06-10Daily bump.GCC Administrator1-0/+25
2025-06-09libstdc++: sstream from string_view (P2495R3) [PR119741]Nathan Myers11-19/+1026
Add constructors to stringbuf, stringstream, istringstream, and ostringstream, and a matching overload of str(sv) in each, that take anything convertible to a string_view in places where the existing ctors and function take a string. Note this change omits the constraint applied to the istringstream constructor from string cited as a "drive-by" in P2495R3, as we have determined it is redundant. libstdc++-v3/ChangeLog: PR libstdc++/119741 * include/std/sstream: full implementation, really just decls, requires clause and plumbing. * include/bits/version.def, include/bits/version.h: new preprocessor symbol __cpp_lib_sstream_from_string_view. * testsuite/27_io/basic_stringbuf/cons/char/string_view.cc: New tests. * testsuite/27_io/basic_istringstream/cons/char/string_view.cc: New tests. * testsuite/27_io/basic_ostringstream/cons/char/string_view.cc: New tests. * testsuite/27_io/basic_stringstream/cons/char/string_view.cc: New tests. * testsuite/27_io/basic_stringbuf/cons/wchar_t/string_view.cc: New tests. * testsuite/27_io/basic_istringstream/cons/wchar_t/string_view.cc: New tests. * testsuite/27_io/basic_ostringstream/cons/wchar_t/string_view.cc: New tests. * testsuite/27_io/basic_stringstream/cons/wchar_t/string_view.cc: New tests. Reviewed-by: Jonathan Wakely
2025-06-09Daily bump.GCC Administrator1-0/+4
2025-06-08libstdc++-v3: Update baseline symbols for hppa-linuxJohn David Anglin1-5889/+18
Duplicate symbol names with no version are removed. 2025-06-08 John David Anglin <danglin@gcc.gnu.org> libstdc++-v3/ChangeLog: * config/abi/post/hppa-linux-gnu/baseline_symbols.txt: Update.
2025-06-07Daily bump.GCC Administrator1-0/+71
2025-06-06libstdc++: Add more tests for semaphoresJonathan Wakely3-0/+53
libstdc++-v3/ChangeLog: * testsuite/30_threads/semaphore/1.cc: Check type properties and max() values. * testsuite/30_threads/semaphore/3.cc: New test. * testsuite/30_threads/semaphore/cons_neg.cc: New test.
2025-06-06libstdc++: Use std::conditional_t instead of lambda to select semaphore ↵Jonathan Wakely2-18/+8
implementation The lambda expression causes testsuite failures such as: FAIL g++.dg/modules/xtreme-header-2_b.C -std=c++26 (test for excess errors) libstdc++-v3/ChangeLog: * include/bits/semaphore_base.h (_Select_semaphore_impl): Rename to _Semaphore_impl and use std::conditional_t instead of an immediately invoked lambda expression. * include/std/semaphore (counting_semaphore): Adjust to use new name.
2025-06-06libstdc++: Adjust effective-target requirements for <barrier> and <semaphore>Jonathan Wakely7-5/+12
These features depend on __cpp_lib_atomic_wait which is not available for freestanding, and is available when either gthreads is supported, or the target is linux (for futex support). libstdc++-v3/ChangeLog: * testsuite/30_threads/barrier/1.cc: Require hosted. Only require gthreads for non-linux targets. * testsuite/30_threads/barrier/2.cc: Likewise. * testsuite/30_threads/semaphore/1.cc: Likewise. * testsuite/30_threads/semaphore/2.cc: Likewise. * testsuite/30_threads/semaphore/cons.cc: Likewise. * testsuite/30_threads/semaphore/least_max_value_neg.cc: Likewise. * testsuite/30_threads/semaphore/try_acquire.cc: Likewise. Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-06-06libstdc++: Fix flat_map::operator[] for const lvalue keys [PR120432]Patrick Palka2-3/+13
The const lvalue operator[] overload wasn't properly forwarding the key type to the generic overload, causing a hard error for const keys. Rather than correcting the forwarded type this patch just makes the non-template overloads call try_emplace directly instead. That way we can remove the non-standard same_as constraint on the generic overload and match the spec more closely. PR libstdc++/120432 libstdc++-v3/ChangeLog: * include/std/flat_map (flat_map::operator[]): Make the non-template overloads call try_emplace directly. Remove non-standard same_as constraint on the template overload. * testsuite/23_containers/flat_map/1.cc (test08): New test. Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com> Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
2025-06-06libstdc++: Add assertions to atomic waiting functions that need platform waitJonathan Wakely2-0/+9
These overloads should never be used for proxy waits, so add assertions to ensure that they aren't used accidentally. The reason they can't be used is that they don't call __args._M_setup_wait to obtain a __wait_state pointer. Even if that was changed, they would wait on a proxy wait which is potentially used by many other threads waiting on other addresses, meaning spurious wake ups are likely. In order to make the functions correct they would need to perform additional loads and comparisons of the atomic variable before calling __wait_impl or __wait_until_impl, which would make these functions no faster than the general purpose overloads that take an accessor function and predicate. That would be possible, and I think they would then work for proxy waits, but doesn't seem necessary at this time. In order to preseve the property that these functions are more lightweight and efficient than the general ones, they should not be used for proxy waits. libstdc++-v3/ChangeLog: * include/bits/atomic_timed_wait.h (__atomic_wait_address_until_v): Add assertion to prevent use with proxy waits. (__atomic_wait_address_for_v): Likewise. * include/bits/atomic_wait.h (__atomic_wait_address_v): Likewise.
2025-06-06libstdc++: Optimize std::counting_semaphore for futex pathJonathan Wakely3-57/+183
Rename __semaphore_base to __semaphore_impl, because it's not used as a base class. Replace the three identical lambda expressions with a named class, __semaphore_impl::_Available, which stores the most recent value of the counter as a data member, and provides call operators that test whether the value is decrementable (i.e. whether the semaphore can be acquired). Add a new __platform_semaphore_impl class template to be used when __platform_wait is available, which uses __platform_wait_t for the counter and uses more efficient atomic waits for the acquire functions. For a binary semaphore some members are further optimized because we know the counter can only be zero or one. Also add a bare wait flag to __atomic_wait_address_v, for consistency with __atomic_wait_address_until_v and __atomic_wait_address_for_v and to allow semaphores to use it without the redundant overhead of tracking waiters. libstdc++-v3/ChangeLog: * include/bits/atomic_wait.h (__atomic_wait_address_v): Add bare wait flag. * include/bits/semaphore_base.h (__semaphore_base): Rename to __semaphore_impl. Replace local variable and predicate lambdas with _Available struct. (__platform_semaphore_impl): New class template. (__semaphore_impl): Remove alias template. (_Select_semaphore_impl): New alias template. * include/std/semaphore (counting_semaphore): Use _Select_semaphore_impl.
2025-06-06libstdc++: Support wide characters output for sys_info and local_info [PR120565]Tomasz Kamiński2-13/+18
Formatting sys_info as wchar_t require widening of the abbrev (zone) member. To support that we reuse the existing code in support for '%Z' specifier, for local_time_format, and produce output using singe format call with "[{0:%F %T},{1:%F %T},{2:%T},{3:%Q%q},{0:%Z}]" format string. As noted in the comment, produced output is locale independed, as it does not contain decimal separtors. For sys_info, the outputed literals are widended using _GLIBCXX_WIDEN, except opening and closing brackets, that are fetched from __format::_Separators. PR libstdc++/120565 libstdc++-v3/ChangeLog: * include/bits/chrono_io.h (operator<<(basic_ostream<_CharT, _Traits>&, const sys_info&)) (operator<<(basic_ostream<_CharT, _Traits>&, const local_info&)): Support wchar_t as _CharT. * testsuite/std/time/format/empty_spec.cc: Instantiated test_infos for wchar_t and increase timeout. Reviewed-by: Jonathan Wakely <jwakely@redhat.com> Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-06-06libstdc++: Test for formatting with empty spec for local_info and sys_info.Tomasz Kamiński1-3/+108
We do not test with wchar_t currently, as operator<< (and format) are ill-formed in such case, because we do not widen abbrev member of local_info. Adding a tests for behavior of the ostream operator and the formatting with empty chrono-spec for the chrono types. The coverage is now complete: * sys_info, local_info in this commit, * time point, zoned_time and local_time_format in r16-1107-g3cfa53aa95a19c, * duration and hh_mm_ss in r16-1099-gac0a04b7a254fb, * calendar types in r16-1016-g28a17985dd34b7. Finally, the timeout for the test was increased again and preprocessor checks for zoned_time where changed to _GLIBCXX_USE_CXX11_ABI || !_GLIBCXX_USE_DUAL_ABI to match ones from bits/chrono_io.h file. libstdc++-v3/ChangeLog: * testsuite/std/time/format/empty_spec.cc: New tests and increased timeout. Reviewed-by: Jonathan Wakely <jwakely@redhat.com> Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-06-06Daily bump.GCC Administrator1-0/+64
2025-06-05libstdc++: Fix std::format thousands separators when sign present [PR120548]Jonathan Wakely2-2/+19
The leading sign character should be skipped when deciding whether to insert thousands separators into a floating-point format. libstdc++-v3/ChangeLog: PR libstdc++/120548 * include/std/format (__formatter_fp::_M_localize): Do not include a leading sign character in the string to be grouped. * testsuite/std/format/functions/format.cc: Check grouping when sign is present in the output. Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-06-05libstdc++: Export std::indirect and std::polymorphic from std module [PR119152]Tomasz Kamiński1-0/+8
PR libstdc++/119152 libstdc++-v3/ChangeLog: * src/c++23/std.cc.in (std::indirect, pmr::indirect) [__cpp_lib_indirect] (std::polymorphic, pmr::polymorphic) [__cpp_lib_polymorphic]: Export.
2025-06-05libstdc++: Fix formatting of 3-digits months,day,weekday and hour [PR120481]Tomasz Kamiński3-73/+480
This patch fixes the handle multiple digits values for the month, day, weekday and hour, when used with the %m, %d, %e, %m, %u, %w, %H, and %D, %F specifiers. The values are now printed unmodified. This patch also fixes printing negative year with %F, where the values was not padded to four digits. Furthemore, the %I,%p are adjusted to handle input with hours values set to over 24 hours. In the case the values is interpretd modulo 24. This was already the case for %r (locale's 12-hour clock), as we convert the input into seconds. In case of %u, %w we print values unchanged, this makes the behavior of this specifiers equivalent to printing the iso_encoding and c_encoding respectively. As constructing weekday from value 7, initializes it with 0, the !ok() weekdays values are always greater of equal eight, so they are clearly distinguishable. The months, weekday, day values that can have 3 decimal digit as maximum (range [0, 255]), we are using new _S_str_d1, _S_str_d2 that return string_view containing textual representation, without padding or padded to two digits. This function accepts are 3 character buffer, that are used for 3 digits number. In other cases, we return _S_digit and _S_two_digits result directly. The former is changed to return string_view to facilitate this. For %F and %D when at least one component have more digits that expected (2 for month and day, 4 for year), we produce output using format_to with appropriate format string. Otherwise the representation is produced in local char buffer. Two simply fill this buffer, _S_fill_two_digits function was added. We also make sure that minus is not included in year width for %F. The handling of %C, %Y, %y was adjusted to use similar pattern, for years with more than two digits. To support that the order of characters in _S_chars was adjusted so it contain "-{}" string. For handling of %H, we print 3 or more digits values using format_to. The handling for large hours values in %T and %R was changed, so they printed using format_to, and otherwise we use same stack buffer as for minutes to print them. PR libstdc++/120481 libstdc++-v3/ChangeLog: * include/bits/chrono_io.h (__format::_S_chars): Reorder so it contains "-{}". (__format::_S_colon, __format::_S_slash, __format::_S_space) (__format::_S_plus_minus): Updated starting indicies. (__format::_S_minus_empty_spec): Define. (__formatter_chrono::_M_C_y_Y, __formatter_chrono::_M_R_T): Rework implementation. (__formatter_chrono::_M_d_e, __formatter_chrono::_M_F) (__formatter_chrono::_M_m, __formatter_chrono::_M_u_w) (__formatter_chrono::_M_H_I, __formatter_chrono::_M_p): Handle multi digits values. (__formatter_chrono::_S_digit): Return string view. (__formatter_chrono::_S_str_d1, __formatter_chrono::_S_str_d2) (__formatter_chrono::_S_fill_two_digits): Define. * testsuite/std/time/format/empty_spec.cc: Update test for year_month_day, that uses '%F'. * testsuite/std/time/format/pr120481.cc: New test. Reviewed-by: Jonathan Wakely <jwakely@redhat.com> Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-06-04Revert "libstdc++: sstream from string_view (P2495R3) [PR119741]"Nathan Myers11-1010/+19
This reverts commit 8537e4851072ea1f1982c4c6ab0d24c9383e9edd.
2025-06-05Daily bump.GCC Administrator1-0/+96
2025-06-04libstdc++: Skip time zone format testing for COW std::stringJonathan Wakely1-0/+4
This is needed when testing with -D_GLIBCXX_USE_CXX11_ABI=0 to fix: FAIL: std/time/format/empty_spec.cc -std=gnu++20 (test for excess errors) libstdc++-v3/ChangeLog: * testsuite/std/time/format/empty_spec.cc: Only test time zones for cxx11 string ABI.
2025-06-04libstdc++: Make system_clock::to_time_t always_inline [PR99832]Jonathan Wakely2-0/+16
For some 32-bit targets Glibc supports changing the size of time_t to be 64 bits by defining _TIME_BITS=64. That causes an ABI change which would affect std::chrono::system_clock::to_time_t. Because to_time_t is not a function template, its mangled name does not depend on the return type, so it has the same mangled name whether it returns a 32-bit time_t or a 64-bit time_t. On targets where the size of time_t can be selected at preprocessing time, that can cause ODR violations, e.g. the linker selects a definition of to_time_t that returns a 32-bit value but a caller expects 64-bit and so reads 32 bits of garbage from the stack. This commit adds always_inline to to_time_t so that all callers inline the conversion to time_t, and will do so using whatever type time_t happens to be in that translation unit. Existing objects compiled before this change will either have inlined the function anyway (which is likely if compiled with any optimization enabled) or will contain a COMDAT definition of the inline function and so still be able to find it at link-time. The attribute is also added to system_clock::from_time_t, because that's an equally simple function and it seems reasonable for them to both be always inlined. libstdc++-v3/ChangeLog: PR libstdc++/99832 * include/bits/chrono.h (system_clock::to_time_t): Add always_inline attribute to be agnostic to the underlying type of time_t. (system_clock::from_time_t): Add always_inline for consistency with to_time_t. * testsuite/20_util/system_clock/99832.cc: New test.
2025-06-04libstdc++: sstream from string_view (P2495R3) [PR119741]Nathan Myers11-19/+1010
Add constructors to stringbuf, stringstream, istringstream, and ostringstream, and a matching overload of str(sv) in each, that take anything convertible to a string_view in places where the existing ctors and function take a string. Note this change omits the constraint applied to the istringstream constructor from string cited as a "drive-by" in P2495R3, as we have determined it is redundant. libstdc++-v3/ChangeLog: PR libstdc++/119741 * include/std/sstream: full implementation, really just decls, requires clause and plumbing. * include/bits/version.def, include/bits/version.h: new preprocessor symbol __cpp_lib_sstream_from_string_view. * testsuite/27_io/basic_stringbuf/cons/char/string_view.cc: New tests. * testsuite/27_io/basic_istringstream/cons/char/string_view.cc: New tests. * testsuite/27_io/basic_ostringstream/cons/char/string_view.cc: New tests. * testsuite/27_io/basic_stringstream/cons/char/string_view.cc: New tests. * testsuite/27_io/basic_stringbuf/cons/wchar_t/string_view.cc: New tests. * testsuite/27_io/basic_istringstream/cons/wchar_t/string_view.cc: New tests. * testsuite/27_io/basic_ostringstream/cons/wchar_t/string_view.cc: New tests. * testsuite/27_io/basic_stringstream/cons/wchar_t/string_view.cc: New tests.
2025-06-04libstdc++: Implement P0849R8 auto(x) library changesPatrick Palka3-31/+28
This implements the library changes in P0849R8 "auto(x): decay-copy in the language" which consist of replacing most uses of the exposition-only function decay-copy with auto(x) throughout the library wording. We implement this as a DR against C++20 since there should be no behavior change in practice (especially in light of LWG 3724 which makes decay-copy SFINAE-friendly). The main difference between decay-copy and auto(x) is that decay-copy materializes its argument unlike auto(x), and so the latter is a no-op when its argument is a prvalue. Effectively the former could introduce an unnecessary move constructor call in some contexts. In C++20 and earlier we could emulate auto(x) with decay_t<decltype((x))>(x). After this paper the only remaining uses of decay-copy in the standard are in the specification of some range adaptors. In our implementation of those range adaptors I believe decay-copy is already implied which is why we don't use __decay_copy explicitly there. So since it's apparently no longer needed this patch goes ahead and removes __decay_copy. libstdc++-v3/ChangeLog: * include/bits/c++config (_GLIBCXX_AUTO_CAST): Define. * include/bits/iterator_concepts.h (_Decay_copy, __decay_copy): Remove. (__member_begin, __adl_begin): Use _GLIBCXX_AUTO_CAST instead of __decay_copy as per P0849R8. * include/bits/ranges_base.h (_Begin): Likewise. (__member_end, __adl_end, _End): Likewise. (__member_rbegin, __adl_rbegin, _RBegin): Likewise. (__member_rend, __adl_rend, _Rend): Likewise. (__member_size, __adl_size, _Size): Likewise. (_Data): Likewise. Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
2025-06-04libstdc++: Test for formatting with empty spec for time points.Tomasz Kamiński1-14/+194
Adding a tests for behavior of the ostream operator and the formatting with empty chrono-spec for the chrono types. Current coverage is: * time point, zoned_time and local_time_format in this commit, * duration and hh_mm_ss in r16-1099-gac0a04b7a254fb, * calendar types in r16-1016-g28a17985dd34b7. libstdc++-v3/ChangeLog: * testsuite/std/time/format/empty_spec.cc: New tests. Reviewed-by: Jonathan Wakely <jwakely@redhat.com> Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-06-04libstdc++: Implement C++23 P1659R3 starts_with and ends_withPatrick Palka7-0/+594
This implements ranges::starts_with and ranges::ends_with from the C++23 paper P1659R3. The corresponding_S_impl member functions take optional optional size parameters __n1 and __n2 of the two ranges, where -1 means the corresponding size is not known. libstdc++-v3/ChangeLog: * include/bits/ranges_algo.h (__starts_with_fn, starts_with): Define. (__ends_with_fn, ends_with): Define. * include/bits/version.def (ranges_starts_ends_with): Define. * include/bits/version.h: Regenerate. * include/std/algorithm: Provide __cpp_lib_ranges_starts_ends_with. * src/c++23/std.cc.in (ranges::starts_with): Export. (ranges::ends_with): Export. * testsuite/25_algorithms/ends_with/1.cc: New test. * testsuite/25_algorithms/starts_with/1.cc: New test. Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com> Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
2025-06-04libstdc++: Refactor __semaphore_base member functionsJonathan Wakely1-19/+22
Replace the _S_get_current and _S_do_try_acquire static member functions with non-static member functions _M_get_current and _M_do_try_acquire. This means they don't need the address of _M_counter passed in. libstdc++-v3/ChangeLog: * include/bits/semaphore_base.h (_S_get_current): Replace with non-static _M_get_current. (_S_do_try_acquire): Replace with non-static _M_do_try_acquire. Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-06-04libstdc++: Fix std::counting_semaphore::acquire deadlock [PR104928]Jonathan Wakely3-23/+222
There's a deadlock in std::counting_semaphore that occurs when the semaphore is under contention. The bug happens when one thread tries to acquire the mutex, calling __semaphore_base::_S_do_try_acquire to atomically decrement the counter using compare_exchange_strong. If the counter is non-zero (and so should be possible to decrement) but another thread changes it (either incrementing or decrementing it) then the compare_exchange fails and _S_do_try_acquire returns false. Because that function is used by the predicate passed to __atomic_wait_address, when it returns false the thread does a futex wait until the value changes. However, when the predicate is false because the compare_exchange failed due to not matching the expected value, waiting for the value to change is incorrect. The correct behaviour would be to retry the compare_exchange using the new value (as long as it's still non-zero). Waiting for the value to change again means we can block forever, because it might never change again. The predicate should only test the value, not also attempt to alter it, and its return value should mean only one thing, not conflate a busy semaphore that cannot be acquired with a contended one that can be acquired by retrying. The correct behaviour of __semaphore_base::_M_acquire would be to attempt the decrement, and to retry immediately if it failed due to contention on the variable (i.e. due to the variable not having the expected value). It should only wait for the value to change when the value is zero, because that's the only time we can't decrement it. This commit moves the _S_do_try_acquire call out of the predicate and loops while it is false, only doing an atomic wait when the counter's value is zero. The predicate used for the atomic wait now only checks whether the value is decrementable (non-zero), without also trying to perform that decrement. In order for the caller to tell whether it should retry a failed _S_do_try_acquire or should wait for the value to be non-zero, the value obtained by a failed compare_exchange needs to be passed back to the caller. _S_do_try_acquire is changed to take its parameter by reference, so that the caller gets the new value and can check whether it's zero. In order to avoid doing another atomic load after returning from an atomic wait, the predicate is also changed to capture the local __val by reference, and then assign to __val when it sees a non-zero value. That makes the new value available to _M_acquire, so it can be passed to _S_do_try_acquire as the expected value of the compare_exchange. Although this means that the predicate is modifying data again, not just checking a value, this modification is safe. It's not changing the semaphore's counter, only changing a local variable in the caller to avoid a redundant atomic load. Equivalent changes are made to _M_try_acquire_until and _M_try_acquire_for. They have the same bug, although they can escape the deadlock if the wait is interrupted by timing out. For _M_acquire there's no time out so it potentially waits forever. _M_try_acquire also has the same bug, but can be simplified to just calling _M_try_acquire_for(0ns). A timeout of zero results in calling __wait_impl with the __spin_only flag set, so that the value is loaded and checked in a spin loop but there is no futex wait. This means that _M_try_acquire can still succeed under light contention if the counter is being changed concurrently, at the cost of a little extra overhead. It would be possible to implement _M_try_acquire as nothing more than an atomic load and a compare_exchange, but it would fail when there is any contention. libstdc++-v3/ChangeLog: PR libstdc++/104928 * include/bits/semaphore_base.h (_S_do_try_acquire): Take old value by reference. (_M_acquire): Move _S_do_try_acquire call out of the predicate and loop on its result. Make the predicate capture and update the local copy of the value. (_M_try_acquire_until, _M_try_acquire_for): Likewise. (_M_try_acquire): Just call _M_try_acquire_for. * testsuite/30_threads/semaphore/104928-2.cc: New test. * testsuite/30_threads/semaphore/104928.cc: New test. Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-06-04libstdc++: Fix format call and test formatting with empty specs for durations.Tomasz Kamiński2-1/+273
This patches fixes an obvious error, where the output iterator argument was missing for call to format_to, when duration with custom representation types are used. It's also adding the test for behavior of ostream operator and the formatting with empty chron-spec for the chrono types. Current coverage is: * duration and hh_mm_ss in this commit, * calendar types in r16-1016-g28a17985dd34b7. libstdc++-v3/ChangeLog: * include/bits/chrono_io.h (__formatter_chrono:_M_s): Add missing __out argument to format_to call. * testsuite/std/time/format/empty_spec.cc: New test. Reviewed-by: Jonathan Wakely <jwakely@redhat.com> Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-06-04Daily bump.GCC Administrator1-0/+42
2025-06-03libstdc++: Check feature test macro for jthread in <stop_token>Jonathan Wakely1-4/+3
Check the appropriate feature test macro instead of checking that __cplusplus >= 201703L. libstdc++-v3/ChangeLog: * include/std/stop_token: Check __glibcxx_jthread instead of __cplusplus.
2025-06-03libstdc++: Use new __is_destructible built-in in <type_traits>Jonathan Wakely1-2/+40
libstdc++-v3/ChangeLog: * include/std/type_traits (is_destructible, is_destructible_v): Define using new built-in. (is_nothrow_destructible, is_nothrow_destructible_v): Likewise. (is_trivially_destructible, is_trivially_destructible_v): Likewise. Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-06-03libstdc++: Fix errors and incorrect returns in atomic timed waitsJonathan Wakely2-13/+18
The __detail::__wait_until function has a comment that should have been removed when r16-1000-g225622398a9631 changed the return type from a std::pair to a struct with three members. The __atomic_wait_address_until_v and __atomic_wait_address_for_v function templates are apparently never used or instantiated, because they don't compile. This fixes them, but they're still unused. I plan to make use of them in a later commit. In __atomic_wait_address_until_v, __res.first in the return statement should have also been changed when r16-1000-g225622398a9631 changed __wait_result_type, and &__args should have been changed to just __args by r16-988-g219bb905a60d95. In __atomic_wait_address_for_v, the parameter is a copy & paste error and should use chrono::duration not chrono::time_point Fix _M_spin_until_impl so that the _M_has_val member of the result is accurate. If the deadline has passed then it never enters the loop and so never loads a fresh value, so _M_has_val should be false. There's also a redundant clock::now() call in __spin_until_impl which can be removed, we can reuse the call immediately before it. libstdc++-v3/ChangeLog: * include/bits/atomic_timed_wait.h (__detail::__wait_until): Remove incorrect comment. (__atomic_wait_address_until_v): Do not take address of __args in call to __detail::__wait_until. Fix return statement to refer to member of __wait_result_type. (__atomic_wait_address_for_v): Change parameter type from time_point to duration. * src/c++20/atomic.cc (__spin_until_impl): Fix incorrect return value. Reuse result of first call to clock.
2025-06-03libstdc++: Replace some implicit conversions in std::vectorJonathan Wakely2-3/+5
This replaces two implicit conversions from ptrdiff_t to size_t with explicit conversions that include unreachable hints for the ptrdiff_t value not being negative. libstdc++-v3/ChangeLog: * include/bits/stl_vector.h (~_Vector_base): Add unreachable hint for negative capacity and cast to size_t explicitly. * include/bits/vector.tcc (vector::_M_realloc_append): Use size() instead of end() - begin(). Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-06-03libstdc++: Use explicit cast to unsigned in std::rotr and std::rotlJonathan Wakely1-2/+2
This suppresses some -Wsign-conversion warnings from Clang when compiling with -Wsystem-headers. libstdc++-v3/ChangeLog: * include/std/bit (__rotl, __rotr): Use static_cast for conversion from int to unsigned. Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-06-03libstdc++: Remove redundant macro checks in std.cc.inJonathan Wakely1-8/+0
__cpp_lib_any and __cpp_lib_chrono are defined unconditionally in C++20 and __cpp_lib_three_way_comparison and __cpp_lib_concepts depend on front-end features which are definitely supported by GCC trunk and all non-GCC compilers we care about. libstdc++-v3/ChangeLog: * src/c++23/std.cc.in: Remove redundant checks for feature test macros that are always true. Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-06-03Daily bump.GCC Administrator1-0/+62
2025-06-02libstdc++: Remove spaces before function parameter listJonathan Wakely4-7/+7
We don't use this GCC coding convention in libstdc++. libstdc++-v3/ChangeLog: * include/bits/basic_string.h (basic_string::size): Remove space before parameter list. (basic_string::capacity): Likewise. * include/bits/stl_deque.h (deque::size): Likewise. * include/bits/stl_vector.h (vector::size, vector::capacity): Likewise. * include/bits/vector.tcc (vector::_M_realloc_insert): Likewise. (vector::_M_realloc_append): Likewise.
2025-06-02libstdc++: Implement LWG 2439 for std::unique_copy [PR120386]Jonathan Wakely3-41/+182
The current overload set for __unique_copy handles three cases: - The input range uses forward iterators, the output range does not. This is the simplest case, and can just compare adjacent elements of the input range. - Neither the input range nor output range use forward iterators. This requires a local variable copied from the input range and updated by assigning each element to the local variable. - The output range uses forward iterators. For this case we compare the current element from the input range with the element just written to the output range. There are two problems with this implementation. Firstly, the third case assumes that the value type of the output range can be compared to the value type of the input range, which might not be possible at all, or might be possible but give different results to comparing elements of the input range. This is the problem identified in LWG 2439. Secondly, the third case is used when both ranges use forward iterators, even though the first case could (and should) be used. This means that we compare elements from the output range instead of the input range, with the problems described above (either not well-formed, or might give the wrong results). The cause of the second problem is that the overload for the first case looks like: OutputIterator __unique_copy(ForwardIter, ForwardIter, OutputIterator, BinaryPred, forward_iterator_tag, output_iterator_tag); When the output range uses forward iterators this overload cannot be used, because forward_iterator_tag does not inherit from output_iterator_tag, so is not convertible to it. To fix these problems we need to implement the resolution of LWG 2439 so that the third case is only used when the value types of the two ranges are the same. This ensures that the comparisons are well behaved. We also need to ensure that the first case is used when both ranges use forward iterators. This change replaces a single step of tag dispatching to choose between three overloads with two step of tag dispatching, choosing between two overloads at each step. The first step dispatches based on the iterator category of the input range, ignoring the category of the output range. The second step only happens when the input range uses non-forward iterators, and dispatches based on the category of the output range and whether the value type of the two ranges is the same. So now the cases that are handled are: - The input range uses forward iterators. - The output range uses non-forward iterators or a different value type. - The output range uses forward iterators and has the same value type. For the second case, the old code used __gnu_cxx::__ops::__iter_comp_val to wrap the predicate in another level of indirection. That seems unnecessary, as we can just use a pointer to the local variable instead of an iterator referring to it. During review of this patch, it was discovered that all known implementations of std::unique_copy and ranges::unique_copy (except cmcstl2) disagree with the specification. The standard (and the SGI STL documentation) say that it uses pred(*i, *(i-1)) but everybody uses pred(*(i-1), *i) instead, and apparently always has done. This patch adjusts ranges::unique_copy to be consistent. In the first __unique_copy overload, the local copy of the iterator is changed to be the previous position not the next one, so that we use ++first as the "next" iterator, consistent with the logic used in the other overloads. This makes it easier to compare them, because we aren't using pred(*first, *next) in one and pred(something, *first) in the others. Instead it's always pred(something, *first). libstdc++-v3/ChangeLog: PR libstdc++/120386 * include/bits/ranges_algo.h (__unique_copy_fn): Reorder arguments for third case to match the first two cases. * include/bits/stl_algo.h (__unique_copy): Replace three overloads with two, depending only on the iterator category of the input range. Dispatch to __unique_copy_1 for the non-forward case. (__unique_copy_1): New overloads for the case where the input range uses non-forward iterators. (unique_copy): Only pass the input range category to __unique_copy. * testsuite/25_algorithms/unique_copy/lwg2439.cc: New test. Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-06-02libstdc++: Pass small trivial types by value in polymorphic wrappersTomasz Kamiński13-12/+202
This patch adjust the passing of parameters for the move_only_function, copyable_function and function_ref. For types that are declared as being passed by value in signature template argument, they are passed by value to the invoker, when they are small (at most two pointers), trivially move constructible and trivially destructible. The latter guarantees that passing them by value has not user visible side effects. In particular, this extends the set of types forwarded by value, that was previously limited to scalars, to also include specializations of std::span and std::string_view, and similar standard and program defined-types. Checking the suitability of the parameter types requires the types to be complete. As a consequence, the implementation imposes requirements on instantiation of move_only_function and copyable_function. To avoid producing the errors from the implementation details, a static assertion was added to partial specializations of copyable_function, move_only_function and function_ref. The static assertion uses existing __is_complete_or_unbounded, as arrays type parameters are automatically decayed in function type. Standard already specifies in [res.on.functions] p2.5 that instantiating these partial specialization with incomplete types leads to undefined behavior. libstdc++-v3/ChangeLog: * include/bits/funcwrap.h (__polyfunc::__pass_by_rref): Define. (__polyfunc::__param_t): Update to use __pass_by_rref. * include/bits/cpyfunc_impl.h:: Assert that are parameters type are complete. * include/bits/funcref_impl.h: Likewise. * include/bits/mofunc_impl.h: Likewise. * testsuite/20_util/copyable_function/call.cc: New test. * testsuite/20_util/function_ref/call.cc: New test. * testsuite/20_util/move_only_function/call.cc: New test. * testsuite/20_util/copyable_function/conv.cc: New test. * testsuite/20_util/function_ref/conv.cc: New test. * testsuite/20_util/move_only_function/conv.cc: New test. * testsuite/20_util/copyable_function/incomplete_neg.cc: New test. * testsuite/20_util/function_ref/incomplete_neg.cc: New test. * testsuite/20_util/move_only_function/incomplete_neg.cc: New test. Reviewed-by: Patrick Palka <ppalka@redhat.com> Reviewed-by: Jonathan Wakely <jwakely@redhat.com> Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-06-02libstdc++: Implement C++26 std::polymorphic [PR119152]Jonathan Wakely12-1/+1789
This patch implements C++26 std::polymorphic as specified in P3019 with amendment to move assignment from LWG 4251. The implementation always allocate stored object on the heap. The manager function (_M_manager) is similary keep with the object (polymorphic::_Obj), which reduces the size of the polymorphic to size of the single pointer plus allocator (that is declared with [[no_unique_address]]). The implementation does not not use small-object optimization (SSO). We may consider adding this in the future, as SSO is allowed by the standard. However, storing any polimorphic object will require providing space for two pointers (manager function and vtable pointer) and user-declared data members. PR libstdc++/119152 libstdc++-v3/ChangeLog: * include/bits/indirect.h (std::polymorphic, pmr::polymorphic) [__glibcxx_polymorphic]: Define. * include/bits/version.def (polymorphic): Define. * include/bits/version.h: Regenerate. * include/std/memory: Define __cpp_lib_polymorphic. * testsuite/std/memory/polymorphic/copy.cc: New test. * testsuite/std/memory/polymorphic/copy_alloc.cc: New test. * testsuite/std/memory/polymorphic/ctor.cc: New test. * testsuite/std/memory/polymorphic/ctor_poly.cc: New test. * testsuite/std/memory/polymorphic/incomplete.cc: New test. * testsuite/std/memory/polymorphic/invalid_neg.cc: New test. * testsuite/std/memory/polymorphic/move.cc: New test. * testsuite/std/memory/polymorphic/move_alloc.cc: New test. Co-authored-by: Tomasz Kamiński <tkaminsk@redhat.com> Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-05-31Daily bump.GCC Administrator1-0/+308
2025-05-30libstdc++: Test for formatting with empty spec for calendar types.Tomasz Kamiński1-0/+301
Adding a test for behavior of the ostream operator and the formatting with empty chron-spec for the chrono types. This commit covers calendar types. libstdc++-v3/ChangeLog: * testsuite/std/time/format/empty_spec.cc: New test. Reviewed-by: Jonathan Wakely <jwakely@redhat.com> Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-05-30libstdc++: Define __wait_result_type for atomic waitingJonathan Wakely3-48/+80
libstdc++-v3/ChangeLog: * include/bits/atomic_timed_wait.h: Use __wait_result_type. * include/bits/atomic_wait.h (__wait_result_type): New struct. (__wait_args::_M_prep_for_wait_on): Rename to _M_setup_wait, use __wait_result_type. (__atomic_wait_address): Adjust to call _M_setup_wait. * src/c++20/atomic.cc (__spin_impl): Use __wait_result_type. (__wait_impl): Likewise. (__spin_until_impl): Likewise. (__wait_until_impl): Likewise.
2025-05-30libstdc++: Rewrite std::counting_semaphore base class [PR118494]Jonathan Wakely11-450/+82
Remove __platform_semaphore. Replace __atomic_semaphore with __semaphore_base<bool> and change its counter to be ptrdiff_t when the count doesn't fit in __platform_wait_t (PR 118494). Make the std::counting_semaphore constructor constexpr to support constant initialization (PR 110854). Add precondition checks to the constructor and release member functions (PR 98749). libstdc++-v3/ChangeLog: PR libstdc++/118494 PR libstdc++/110854 PR libstdc++/98749 * acinclude.m4 (GLIBCXX_CHECK_GTHREADS): Remove checks for sem_timedwait. Do not define _GLIBCXX_HAVE_POSIX_SEMAPHORE. * config.h.in: Regenerate. * configure: Regenerate. * include/bits/semaphore_base.h (__platform_semaphore): Remove. (__atomic_semaphore): Replace with __semaphore_base<bool> and make type of _M_count depend on template parameter. Fix _S_max constant to use correct type. (__semaphore_base::_M_try_acquire): Qualify to avoid ADL. (__semaphore_base::_M_release): Return old value. Remove FIXME comment. (__semaphore_impl): Replace typedef with alias template. * include/bits/version.def (semaphore): Do not depend on _GLIBCXX_HAVE_POSIX_SEMAPHORE. * include/bits/version.h: Regenerate. * include/std/semaphore (semaphore): Adjust type of _M_sem member. Add constexpr to constructor. Add assertions to (semaphore::semaphore(ptrdiff_t)): Add constexpr. Add assertion for precondition. (semaphore::release): Add assertion using value returned from _M_release. * testsuite/30_threads/semaphore/100806.cc: Increase template argument for std::counting_semaphore, so constructor precondition is met. * testsuite/30_threads/semaphore/cons.cc: New test. * testsuite/30_threads/semaphore/try_acquire_posix.cc: Remove. * testsuite/30_threads/semaphore/platform_try_acquire_for.cc: Removed.
2025-05-30libstdc++: Create new base class of std::barrier<C> for non-dependent codeJonathan Wakely1-79/+91
This moves all non-dependent state and logic for std::barrier<C> into a new non-template base class, to avoid template bloat. This would permit moving the _M_arrive function into the library instead of the header. libstdc++-v3/ChangeLog: * include/std/barrier (__tree_barrier_base): New class. (__tree_barrier): Move non-dependent code into __tree_barrier_base and derive from it.
2025-05-30libstdc++: Fix std::barrier for constant initialization [PR118395]Jonathan Wakely3-15/+93
The std::barrier constructor should be constexpr, which means we need to defer the dynamic allocation if the constructor is called during constant-initialization. We can defer it to the first call to barrier::arrive, using compare-and-swap on an atomic<T*> (instead of the unique_ptr<T[]> currently used). Also add precondition checks to the constructor and arrive member function. Also implement the proposed resolution of LWG 3898. libstdc++-v3/ChangeLog: PR libstdc++/118395 PR libstdc++/108974 PR libstdc++/98749 * include/std/barrier (__tree_barrier): Use default member-initializers. Change _M_state member from unique_ptr<__state_t[]> to atomic<__state_t*>. Add no_unique_address attribute to _M_completion. (__tree_barrier::_M_arrive): Load value from _M_state. (__tree_barrier::_M_invoke_completion): New member function to ensure a throwing completion function will terminate, as proposed in LWG 3898. (__tree_barrier::max): Reduce by one to avoid overflow. (__tree_barrier::__tree_barrier): Add constexpr. Qualify call to std::move. Remove mem-initializers made unnecessary by default member-initializers. Add precondition check. Only allocate state array if not constant evaluated. (__tree_barrier::arrive): Add precondition check. Do deferred initialization of _M_state if needed. (barrier): Add static_assert, as proposed in LWG 3898. (barrier::barrier): Add constexpr. * testsuite/30_threads/barrier/cons.cc: New test. * testsuite/30_threads/barrier/lwg3898.cc: New test.