Commit Graph

14705 Commits

Author SHA1 Message Date
GCC Administrator 89b48c26d7 Daily bump. 2025-09-10 00:26:21 +00:00
Tomasz Kamiński 128f1602a0 libstdc++: Document remaining C++17 implementation-defined behavior.
This also covers bad_function_call::what from C++11.

libstdc++-v3/ChangeLog:

	* doc/html/manual/status.html: Regenerate.
	* doc/xml/manual/status_cxx2011.xml: Add entry for bad_function_call.
	* doc/xml/manual/status_cxx2017.xml: Add entries for bad_any_cast
	and nullptr_t output. Update entry for sf.cmath. Fix stable name for
	mem.res.

Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
(cherry picked from commit 39d7c4d42a)
2025-09-09 16:15:33 +02:00
Tomasz Kamiński 9e1e285549 libstdc++: Document missing implementation defined behavior for std::filesystem.
libstdc++-v3/ChangeLog:

	* doc/html/manual/status.html: Regenerate the file.
	* doc/xml/manual/status_cxx2017.xml: Addd more entires.

Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
(cherry picked from commit d6c370b8e9)
2025-09-09 16:15:33 +02:00
GCC Administrator 945bd54dca Daily bump. 2025-09-09 00:26:33 +00:00
Jonathan Wakely d01494e8cf
libstdc++: Fix docs for --enable-vtable-verify [PR120698]
libstdc++-v3/ChangeLog:

	PR libstdc++/120698
	* doc/xml/manual/configure.xml: Do not claim that vtv is enabled
	by default.
	* doc/html/manual/configure.html: Regenerate.

(cherry picked from commit d199a9c7c5)
2025-09-08 21:58:22 +01:00
GCC Administrator d6c459e0e0 Daily bump. 2025-09-05 00:21:37 +00:00
Jonathan Wakely ac28c9730c
libstdc++: Make CTAD ignore pair(const T1&, const T2&) constructor [PR110853]
For the pair(T1, T2) explicit deduction type to decay its arguments as
intended, we need the pair(const T1&, const T2&) constructor to not be
used for CTAD. Otherwise we try to instantiate pair<T1, T2> without
decaying, which is ill-formed for function lvalues.

Use std::type_identity_t<T1> to make the constructor unusable for an
implicit deduction guide.

libstdc++-v3/ChangeLog:

	PR libstdc++/110853
	* include/bits/stl_pair.h [C++20] (pair(const T1&, const T2&)):
	Use std::type_identity_t<T1> for first parameter.
	* testsuite/20_util/pair/cons/110853.cc: New test.

Reviewed-by: Patrick Palka <ppalka@redhat.com>
Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
(cherry picked from commit 0bb0d1d288)
2025-09-04 17:35:10 +01:00
Jonathan Wakely 3144909463
libstdc++: Fix std::get<T> for std::pair with reference members [PR121745]
Make the std::get<T> overloads for rvalues use std::forward<T>(p.first)
not std::move(p.first), so that lvalue reference members are not
incorrectly converted to rvalues.

It might appear that std::move(p).first would also work, but the
language rules say that for std::pair<T&&, U> that would produce T&
rather than the expected T&& (see the discussion in P2445R1 §8.2).

Additional tests are added to verify all combinations of reference
members, value categories, and const-qualification.

libstdc++-v3/ChangeLog:

	PR libstdc++/121745
	* include/bits/stl_pair.h (get): Use forward instead of move in
	std::get<T> overloads for rvalue pairs.
	* testsuite/20_util/pair/astuple/get_by_type.cc: Check all value
	categories and cv-qualification.

Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
(cherry picked from commit c8a24f60b6)
2025-09-04 17:35:10 +01:00
Jonathan Wakely 877592a62e
libstdc++: Use __promote_3 for std::hypot [PR121097]
The __promoted_t alias is only defined when __cpp_fold_expressions is
defined, which might not be the case for some hypothetical C++17
compilers.

Change the 3-arg std::hypot to just use __gnu_cxx::__promote_3 which is
always available.

libstdc++-v3/ChangeLog:

	PR libstdc++/121097
	* include/c_global/cmath (hypot): Use __promote_3 instead of
	__promoted.

Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
(cherry picked from commit f4932c59df)
2025-09-04 13:31:38 +01:00
GCC Administrator 28974867ea Daily bump. 2025-06-12 00:22:42 +00:00
Jonathan Wakely 0fce225524
libstdc++: Make system_clock::to_time_t always_inline [PR99832]
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.

(cherry picked from commit d045eb13b0)
2025-06-11 09:19:15 +01:00
Jonathan Wakely f8ae6193b7
libstdc++: Fix std::format thousands separators when sign present [PR120548]
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>
(cherry picked from commit 2c3559839d)
2025-06-11 09:01:51 +01:00
Jonathan Wakely 4f3ce8d046
libstdc++: Tweak localized formatting for floating-point types
libstdc++-v3/ChangeLog:

	* include/std/format (__formatter_fp::_M_localize): Add comments
	and micro-optimize string copy.

(cherry picked from commit 99b8be43d7)
2025-06-11 09:01:44 +01:00
GCC Administrator f7cfab38ef Daily bump. 2025-06-11 00:22:11 +00:00
Jonathan Wakely d97de614f7
libstdc++: Fix incorrect links to archived SGI STL docs
In r8-7777-g25949ee33201f2 I updated some URLs to point to copies of the
SGI STL docs in the Wayback Machine, because the original pags were no
longer hosted on sgi.com. However, I incorrectly assumed that if one
archived page was at https://web.archive.org/web/20171225062613/... then
all the other pages would be too. Apparently that's not how the Wayback
Machine works, and each page is archived on a different date. That meant
that some of our links were redirecting to archived copies of the
announcement that the SGI STL docs have gone away.

This fixes each URL to refer to a correctly archived copy of the
original docs.

libstdc++-v3/ChangeLog:

	* doc/xml/faq.xml: Update URL for archived SGI STL docs.
	* doc/xml/manual/containers.xml: Likewise.
	* doc/xml/manual/extensions.xml: Likewise.
	* doc/xml/manual/using.xml: Likewise.
	* doc/xml/manual/utilities.xml: Likewise.
	* doc/html/*: Regenerate.

(cherry picked from commit 501e6e7866)
2025-06-10 21:02:32 +01:00
GCC Administrator 6694282dd4 Daily bump. 2025-06-07 00:21:58 +00:00
Giuseppe D'Angelo 63be00fe4c libstdc++: fix a dangling reference crash in ranges::is_permutation [PR118160]
The code was caching the result of `invoke(proj, *it)` in a local
`auto &&` variable. The problem is that this may create dangling
references, for instance in case `proj` is `std::identity` (the common
case) and `*it` produces a prvalue: lifetime extension does not
apply here due to the expressions involved.

Instead, store (and lifetime-extend) the result of `*it` in a separate
variable, then project that variable. While at it, also forward the
result of the projection to the predicate, so that the predicate can
act on the proper value category.

libstdc++-v3/ChangeLog:

	PR libstdc++/118160
	PR libstdc++/100249
	* include/bits/ranges_algo.h (__is_permutation_fn): Avoid a
	dangling reference by storing the result of the iterator
	dereference and the result of the projection in two distinct
	variables, in order to lifetime-extend each one.
	Forward the projected value to the predicate.
	* testsuite/25_algorithms/is_permutation/constrained.cc: Add a
	test with a range returning prvalues. Test it in a constexpr
	context, in order to rely on the compiler to catch UB.

Signed-off-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
(cherry picked from commit 2a2bd96d0d)
2025-06-06 10:14:12 +01:00
GCC Administrator 26e891dd7e Daily bump. 2025-06-06 00:22:10 +00:00
Giuseppe D'Angelo 6e8dcc0aa0 libstdc++: fix compile error when converting std::weak_ptr<T[]>
A std::weak_ptr<T[]> can be converted to a compatible
std::weak_ptr<U[]>. This is implemented by having suitable converting
constructors to std::weak_ptr which dispatch to the __weak_ptr base
class (implementation detail).

In __weak_ptr<T[]>, lock() is supposed to return a __shared_ptr<T[]>,
not a __shared_ptr<element_type> (that is, __shared_ptr<T>).

Unfortunately the return type of lock() and the type of the returned
__shared_ptr were mismatching and that was causing a compile error: when
converting a __weak_ptr<T[]> to a __weak_ptr<U[]> through __weak_ptr's
converting constructor, the code calls lock(), and that simply fails to
build.

Fix it by removing the usage of element_type inside lock(), and using
_Tp instead.

Note that std::weak_ptr::lock() itself was already correct; the one in
__weak_ptr was faulty (and that is the one called by __weak_ptr's
converting constructors).

libstdc++-v3/ChangeLog:

	* include/bits/shared_ptr_base.h (lock): Fixed a compile error
	when calling lock() on a weak_ptr<T[]>, by removing an
	erroneous usage of element_type from within lock().
	* testsuite/20_util/shared_ptr/requirements/explicit_instantiation/1.cc:
	Add more tests for array types.
	* testsuite/20_util/weak_ptr/requirements/explicit_instantiation/1.cc:
	Likewise.
	* testsuite/20_util/shared_ptr/requirements/1.cc: New test.
	* testsuite/20_util/weak_ptr/requirements/1.cc: New test.

(cherry picked from commit df0e6509bf)
2025-06-05 18:20:40 +01:00
Jakub Jelinek 99677969d4 Update ChangeLog and version files for release 2025-06-05 16:03:58 +00:00
GCC Administrator 836e2025fd Daily bump. 2025-05-28 00:21:51 +00:00
Patrick Palka c923901d9c libstdc++: Fix backported test [PR112490]
On the 13 branch and older, C++ >= 20 tests need an explicit dg-options
directive specifying the -std flag, otherwise they won't run by default.

	PR libstdc++/112490

libstdc++-v3/ChangeLog:

	* testsuite/24_iterators/const_iterator/112490.cc: Add
	dg-options directive.
2025-05-27 17:49:30 -04:00
Patrick Palka 031e1bf707 libstdc++: Fix complexity of drop_view::begin() const [PR112641]
Views are required to have a amortized O(1) begin(), but our drop_view's
const begin overload is O(n) for non-common ranges with a non-sized
sentinel.  This patch reimplements it so that it's O(1) always.  See
also LWG 4009.

	PR libstdc++/112641

libstdc++-v3/ChangeLog:

	* include/std/ranges (drop_view::begin): Reimplement const
	overload so that it's O(1) always.
	* testsuite/std/ranges/adaptors/drop.cc (test10): New test.

Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
(cherry picked from commit 7f622ee83f)
2025-05-27 16:47:33 -04:00
Patrick Palka d2e2688af9 libstdc++: Fix constraint recursion in basic_const_iterator operator- [PR115046]
It was proposed in PR112490 to also adjust basic_const_iterator's friend
operator-(sent, iter) overload alongside the r15-7757-g4342c50ca84ae5
adjustments to its comparison operators, but we lacked a concrete
testcase demonstrating fixable constraint recursion there.  It turns out
Hewill Kang's PR115046 is such a testcase!  So this patch makes the same
adjustments to that overload as well, fixing PR115046.  The LWG 4218 P/R
will need to get adjusted too.

	PR libstdc++/115046
	PR libstdc++/112490

libstdc++-v3/ChangeLog:

	* include/bits/stl_iterator.h (basic_const_iterator::operator-):
	Replace non-dependent basic_const_iterator function parameter with
	a dependent one of type basic_const_iterator<_It2> where _It2
	matches _It.
	* testsuite/std/ranges/adaptors/as_const/1.cc (test04): New test.

Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
(cherry picked from commit d69f73c033)
2025-05-27 16:38:49 -04:00
Patrick Palka 573422d554 libstdc++: Fix constraint recursion in basic_const_iterator relops [PR112490]
Here for

  using RCI = reverse_iterator<basic_const_iterator<vector<int>::iterator>>
  static_assert(std::totally_ordered<RCI>);

we effectively need to check the requirement

  requires (RCI x) { x RELOP x; }  for each RELOP in {<, >, <=, >=}

which we expect to be straightforwardly satisfied by reverse_iterator's
namespace-scope relops.  But due to ADL we find ourselves also
considering the basic_const_iterator relop friends, which before CWG
2369 would be quickly discarded since RCI clearly isn't convertible to
basic_const_iterator.  After CWG 2369 though we must first check these
relops' constraints (with _It = vector<int>::iterator and _It2 = RCI),
which entails checking totally_ordered<RCI> recursively.

This patch fixes this by turning the problematic non-dependent function
parameters of type basic_const_iterator<_It> into dependent ones of
type basic_const_iterator<_It3> where _It3 is constrained to match _It.
Thus the basic_const_iterator relop friends now get quickly discarded
during deduction and before the constraint check if the second operand
isn't a specialization of basic_const_iterator (or derived from one)
like before CWG 2369.

	PR libstdc++/112490

libstdc++-v3/ChangeLog:

	* include/bits/stl_iterator.h (basic_const_iterator::operator<):
	Replace non-dependent basic_const_iterator function parameter with
	a dependent one of type basic_const_iterator<_It3> where _It3
	matches _It.
	(basic_const_iterator::operator>): Likewise.
	(basic_const_iterator::operator<=): Likewise.
	(basic_const_iterator::operator>=): Likewise.
	* testsuite/24_iterators/const_iterator/112490.cc: New test.

Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
(cherry picked from commit 4342c50ca8)
2025-05-27 16:38:47 -04:00
Patrick Palka a56fdac957 libstdc++: Fix ref_view branch of views::as_const [PR119135]
Unlike for span<X> and empty_view<X>, the range_reference_t of
ref_view<X> doesn't correspond to X.  This patch fixes the ref_view
branch of views::as_const to correctly query its underlying range
type X.

	PR libstdc++/119135

libstdc++-v3/ChangeLog:

	* include/std/ranges: Include <utility>.
	(views::__detail::__is_ref_view): Replace with ...
	(views::__detail::__is_constable_ref_view): ... this.
	(views::_AsConst::operator()): Replace bogus use of element_type
	in the ref_view branch.
	* testsuite/std/ranges/adaptors/as_const/1.cc (test03): Extend
	test.

Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
(cherry picked from commit 50359c0a44)
2025-05-27 16:25:31 -04:00
Patrick Palka d28b05bf57 libstdc++: Implement P2540R1 change to views::cartesian_product()
This paper changes the identity element of views::cartesian_product to a
singleton range instead of an empty range.  It was approved alongside
the main cartesian_product paper P2374R4, but unfortunately was overlooked
when implementing the main paper.

libstdc++-v3/ChangeLog:

	* include/std/ranges (views::_CartesianProduct::operator()):
	Adjust identity case as per P2540R1.
	* testsuite/std/ranges/cartesian_product/1.cc (test01):
	Adjust expected result of the identity case.

Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
(cherry picked from commit 98966f32f9)
2025-05-27 16:12:48 -04:00
Patrick Palka d6551d6d83 libstdc++: Implement P2836R1 changes to const_iterator
libstdc++-v3/ChangeLog:

	* include/bits/stl_iterator.h (const_iterator): Define conversion
	operators as per P2836R1.
	* include/std/ranges (__cpp_lib_ranges_as_const): Update value.
	* include/std/version (__cpp_lib_ranges_as_const): Likewise.
	* testsuite/24_iterators/const_iterator/1.cc (test04): New test.
	* testsuite/std/ranges/adaptors/as_const/1.cc: Adjust expected
	value of __cpp_lib_ranges_as_const.
	* testsuite/std/ranges/version_c++23.cc: Likewise.

Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
(cherry picked from commit 731444b3c3)
2025-05-27 16:12:48 -04:00
Patrick Palka 9c179a7ede libstdc++: Implement LWG 3664 changes to ranges::distance
libstdc++-v3/ChangeLog:

	* include/bits/ranges_base.h (__distance_fn::operator()):
	Adjust iterator/sentinel overloads as per LWG 3664.
	* testsuite/24_iterators/range_operations/distance.cc:
	Test LWG 3664 example.

Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
(cherry picked from commit 7c0d1e9f2a)
2025-05-27 16:10:13 -04:00
GCC Administrator 4c21157a4c Daily bump. 2025-05-13 00:21:28 +00:00
Jonathan Wakely a496464e2f
libstdc++: Update C++23 status table
This should have been updated for the GCC 13.1 release.

libstdc++-v3/ChangeLog:

	* doc/xml/manual/status_cxx2023.xml: Update status of proposals
	implemented for GCC 13.
	* doc/html/manual/status.html: Regenerate.
2025-05-12 14:58:53 +01:00
GCC Administrator 962993f105 Daily bump. 2025-05-09 00:21:31 +00:00
Richard Biener 351ac78e48 libstdc++/112351 - deal with __gthread_once failure during locale init
The following makes the C++98 locale init path follow the way the
C++11 performs initialization.  This way we deal with pthread_once
failing, falling back to non-threadsafe initialization which, given we
initialize from the library, should be serialized by the dynamic
loader already.

	PR libstdc++/112351
libstdc++-v3/
	* src/c++98/locale.cc (locale::facet::_S_initialize_once):
	Check whether _S_c_locale is already initialized.
	(locale::facet::_S_get_c_locale): Always perform non-threadsafe
	init when threadsafe init failed.

(cherry picked from commit 7562f089a1)
2025-05-08 11:47:07 +02:00
GCC Administrator 12ceee15ba Daily bump. 2025-04-25 00:22:33 +00:00
Jakub Jelinek dbe57b12c5 libstdc++: Fix up 117406.cc test [PR117406]
Christophe mentioned in bugzilla that the test FAILs on aarch64,
I'm not including <climits> and use INT_MAX.
Apparently during my testing I got it because the test preinclude
-include bits/stdc++.h
and that includes <climits>, dunno why that didn't happen on aarch64.
In any case, either I can add #include <climits>, or because the
test already has #include <limits> I've changed uses of INT_MAX
with std::numeric_limits<int>::max(), that should be the same thing.
But if you prefer
 #include <climits>
I can surely add that instead.

2024-11-04  Jakub Jelinek  <jakub@redhat.com>

	PR libstdc++/117406
	* testsuite/26_numerics/headers/cmath/117406.cc: Use
	std::numeric_limits<int>::max() instead of INT_MAX.

(cherry picked from commit afcbf4dd27)
2025-04-23 09:15:16 +02:00
Jakub Jelinek e88a25ded9 libstdc++: Fix up std::{,b}float16_t std::{ilogb,l{,l}r{ound,int}} [PR117406]
These overloads incorrectly cast the result of the float __builtin_*
to _Float or __gnu_cxx::__bfloat16_t.  For std::ilogb that changes
behavior for the INT_MAX return because that isn't representable in
either of the floating point formats, for the others it is I think
just a very inefficient hop from int/long/long long to std::{,b}float16_t
and back.  I mean for the round/rint cases, either the argument is small
and then the return value should be representable in the floating point
format too, or it is too large that the argument is already integral
and then it should just return the argument with the round trips.
Too large value is unspecified unlike ilogb.

2024-11-02  Jakub Jelinek  <jakub@redhat.com>

	PR libstdc++/117406
	* include/c_global/cmath (std::ilogb(_Float16), std::llrint(_Float16),
	std::llround(_Float16), std::lrint(_Float16), std::lround(_Float16)):
	Don't cast __builtin_* return to _Float16.
	(std::ilogb(__gnu_cxx::__bfloat16_t),
	std::llrint(__gnu_cxx::__bfloat16_t),
	std::llround(__gnu_cxx::__bfloat16_t),
	std::lrint(__gnu_cxx::__bfloat16_t),
	std::lround(__gnu_cxx::__bfloat16_t)): Don't cast __builtin_* return to
	__gnu_cxx::__bfloat16_t.
	* testsuite/26_numerics/headers/cmath/117406.cc: New test.

(cherry picked from commit 36a9e2b225)
2025-04-23 09:15:08 +02:00
Jakub Jelinek b7dd8cb9f5 libstdc++: Use if consteval rather than if (std::__is_constant_evaluated()) for {,b}float16_t nextafter [PR117321]
The nextafter_c++23.cc testcase fails to link at -O0.
The problem is that eventhough std::__is_constant_evaluated() has
always_inline attribute, that at -O0 just means that we inline the
call, but its result is still assigned to a temporary which is tested
later, nothing at -O0 propagates that false into the if and optimizes
away the if body.  And the __builtin_nextafterf16{,b} calls are meant
to be used solely for constant evaluation, the C libraries don't
define nextafterf16 these days.

As __STDCPP_FLOAT16_T__ and __STDCPP_BFLOAT16_T__ are predefined right
now only by GCC, not by clang which doesn't implement the extended floating
point types paper, and as they are predefined in C++23 and later modes only,
I think we can just use if consteval which is folded already during the FE
and the body isn't included even at -O0.  I've added a feature test for
that just in case clang implements those and implements those in some weird
way.  Note, if (__builtin_is_constant_evaluted()) would work correctly too,
that is also folded to false at gimplification time and the corresponding
if block not emitted at all.  But for -O0 it can't be wrapped into a helper
inline function.

2024-10-29  Jakub Jelinek  <jakub@redhat.com>

	PR libstdc++/117321
	* include/c_global/cmath (nextafter(_Float16, _Float16)): Use
	if consteval rather than if (std::__is_constant_evaluated()) around
	the __builtin_nextafterf16 call.
	(nextafter(__gnu_cxx::__bfloat16_t, __gnu_cxx::__bfloat16_t)): Use
	if consteval rather than if (std::__is_constant_evaluated()) around
	the __builtin_nextafterf16b call.
	* testsuite/26_numerics/headers/cmath/117321.cc: New test.

(cherry picked from commit 5e247ac0c2)
2025-04-23 09:10:14 +02:00
GCC Administrator 415eedea74 Daily bump. 2025-04-19 00:21:38 +00:00
Tomasz Kamiński 5e23f9be63 libstdc++: Correct preprocessing checks for floatX_t and bfloat_16 formatting
Floating points types _Float16, _Float32, _Float64, and bfloat16,
can be formatted only if std::to_chars overloads for such types
were provided. Currently this is only the case for architectures
where float and double are 32-bits and 64-bits IEEE floating points types.

Remove a potential UB, where we could produce basic_format_arg
with _M_type set to _Arg_fp32 or _Arg_fp64, that was later not
handled by `_M_visit`.

libstdc++-v3/ChangeLog:

	* include/std/format (basic_format_arg::_S_to_arg_type): Normalize
	_Float32 and _Float64 only to float and double respectivelly.
	(basic_format_arg::_S_to_enum): Remove handling of _Float32 and _Float64.

Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>

	(cherry picked with modifications from commit 445128c12c)
2025-04-18 09:20:58 +02:00
GCC Administrator 13449ccc5f Daily bump. 2025-04-17 00:21:17 +00:00
Jonathan Wakely 4182fa8775 libstdc++: Add dg-options "-std=gnu++20" to backported tests
These tests were backported from gcc-14 where the testsuite
automatically adds -std=gnu++20 as needed. That doesn't happen on the
older release branches, so an explicit dg-options directive is needed to
ensure the tests are run by default. Otherwise they'll only be run when
somebody uses a custom --target_board that includes -std=gnu++20.

For 23_containers/span/nodiscard.cc we need to remove the dg-warning
lines that only match for -std=gnu++23, because with the explicit
dg-options to set -std=gnu++20 we never actually test it with C++23
mode.

For 29_atomics/headers/stdatomic.h/115807.cc we need to compile with
-std=gnu++23 instead.

libstdc++-v3/ChangeLog:

	* testsuite/20_util/integer_sequence/112473.cc: Compile with
	-std=gnu++20.
	* testsuite/21_strings/char_traits/requirements/113200.cc:
	Likewise.
	* testsuite/23_containers/array/comparison_operators/106212.cc:
	Likewise.
	* testsuite/23_containers/array/creation/115522.cc: Likewise.
	* testsuite/23_containers/span/117966.cc: Likewise.
	* testsuite/23_containers/span/nodiscard.cc: Likewise. Remove
	dg-warning directives for et c++23.
	* testsuite/23_containers/vector/cons/113841.cc: Compile with
	-std=gnu++20.
	* testsuite/24_iterators/common_iterator/101527.cc: Likewise.
	* testsuite/24_iterators/counted_iterator/101527.cc: Likewise.
	* testsuite/24_iterators/move_iterator/lwg3736.cc: Likewise.
	* testsuite/25_algorithms/lexicographical_compare_three_way/113960.cc:
	Likewise.
	* testsuite/27_io/filesystem/iterators/lwg3480.cc: Likewise.
	* testsuite/29_atomics/headers/stdatomic.h/115807.cc: Compile
	with -std=gnu++23.
	* testsuite/experimental/scopeguard/114152.cc: Compile with
	-std=gnu++20.
	* testsuite/std/format/arguments/112607.cc: Likewise.
	* testsuite/std/format/arguments/args_neg.cc: Likewise.
	* testsuite/std/format/context.cc: Likewise.
	* testsuite/std/format/formatter/112832.cc: Likewise.
	* testsuite/std/format/formatter/basic.cc: Likewise.
	* testsuite/std/ranges/subrange/111948.cc: Likewise.
	* testsuite/std/ranges/subrange/lwg3589.cc: Likewise.
	* testsuite/std/time/format/pr117085.cc: Likewise.
	* testsuite/std/time/month/2.cc: Likewise.
	* testsuite/std/time/time_zone/sys_info_abbrev.cc: Likewise.
	* testsuite/std/time/tzdb/links.cc: Likewise.
	* testsuite/std/time/weekday/2.cc: Likewise.
2025-04-16 20:18:11 +01:00
Jonathan Wakely 67a282023b libstdc++: Add test for not using reserved name 'ranges' before C++20
This is a test for a bug that was present on trunk, because 'ranges' is
not a reserved name before C++20.

libstdc++-v3/ChangeLog:

	* testsuite/17_intro/names.cc: Check ranges is not used as an
	identifier before C++20.
2025-04-16 20:13:35 +01:00
Michael Levine 997d51f3dc libstdc++: Fix std::ranges::iota is not included in numeric [PR108760]
Before this patch, using std::ranges::iota required including
<algorithm> when it should have been sufficient to only include
<numeric>.

For the backport to the release branch ranges::iota is defined in
<bits/ranges_algobase.h> so that it's available in both <numeric> and
<algorithm>. This avoids breaking code that compiles successfully using
existing releases where <algorithm> defines ranges::iota.

libstdc++-v3/ChangeLog:

	PR libstdc++/108760
	* include/bits/ranges_algo.h (ranges::out_value_result)
	(ranges::iota_result, ranges::__iota_fn, ranges::iota): Move to
	<bits/ranges_algobase.h>.
	* include/bits/ranges_algobase.h (ranges::out_value_result):
	(ranges::iota_result, ranges::__iota_fn, ranges::iota): Move to
	here.
	* include/std/numeric: Include <bits/ranges_algobase.h>.
	* testsuite/25_algorithms/iota/1.cc: Renamed to ...
	* testsuite/26_numerics/iota/2.cc: ... here.

Signed-off-by: Michael Levine <mlevine55@bloomberg.net>
(cherry picked from commit 0bb1db32cc)
2025-04-16 20:13:35 +01:00
Jonathan Wakely 285f01004e libstdc++: Fix ranges::move and ranges::move_backward to use iter_move [PR105609]
The ranges::move and ranges::move_backward algorithms are supposed to
use ranges::iter_move(iter) instead of std::move(*iter), which matters
for an iterator type with an iter_move overload findable by ADL.

Currently those algorithms use std::__assign_one which uses std::move,
so define a new ranges::__detail::__assign_one helper function that uses
ranges::iter_move.

libstdc++-v3/ChangeLog:

	PR libstdc++/105609
	* include/bits/ranges_algobase.h (__detail::__assign_one): New
	helper function.
	(__copy_or_move, __copy_or_move_backward): Use new function
	instead of std::__assign_one.
	* testsuite/25_algorithms/move/constrained.cc: Check that
	ADL iter_move is used in preference to std::move.
	* testsuite/25_algorithms/move_backward/constrained.cc:
	Likewise.

(cherry picked from commit 3866ca796d)
2025-04-16 20:13:34 +01:00
Jonathan Wakely 46f2ed78d5 libstdc++: Reuse std::__assign_one in <bits/ranges_algobase.h>
Use std::__assign_one instead of ranges::__assign_one. Adjust the uses,
because std::__assign_one has the arguments in the opposite order (the
same order as an assignment expression).

libstdc++-v3/ChangeLog:

	* include/bits/ranges_algobase.h (ranges::__assign_one): Remove.
	(__copy_or_move, __copy_or_move_backward): Use std::__assign_one
	instead of ranges::__assign_one.

Reviewed-by: Patrick Palka <ppalka@redhat.com>
(cherry picked from commit d0a9ae1321)
2025-04-16 20:13:34 +01:00
Jonathan Wakely 892b26e44a libstdc++: Fix ranges::copy_backward for a single memcpyable element [PR117121]
The result iterator needs to be decremented before writing to it.

Improve the PR 108846 tests for all of std::copy, std::copy_n,
std::copy_backward, and the std::ranges versions.

libstdc++-v3/ChangeLog:

	PR libstdc++/117121
	* include/bits/ranges_algobase.h (copy_backward): Decrement
	output iterator before assigning one element through it.
	* testsuite/25_algorithms/copy/108846.cc: Ensure the algorithm's
	effects are correct for a single memcpyable element.
	* testsuite/25_algorithms/copy_backward/108846.cc: Likewise.
	* testsuite/25_algorithms/copy_n/108846.cc: Likewise.

(cherry picked from commit 27f6b376e8)
2025-04-16 20:13:34 +01:00
Giuseppe D'Angelo 84eb2ddc53 libstdc++: Do not use use memmove for 1-element ranges [PR108846,PR116471]
This commit ports the fixes already applied by r13-6372-g822a11a1e642e0
to the range-based versions of copy/move algorithms.

When doing so, a further bug (PR116471) was discovered in the
implementation of the range-based algorithms: although the algorithms
are already constrained by the indirectly_copyable/movable concepts,
there was a failing static_assert in the memmove path.

This static_assert checked that iterator's value type was assignable by
using the is_copy_assignable (move) type traits. However, this is a
problem, because the traits are too strict when checking for constness;
a type like

  struct S { S& operator=(S &) = default; };

is trivially copyable (and thus could benefit of the memmove path),
but it does not satisfy is_copy_assignable because the operator takes
by non-const reference.

Now, the reason for the check to be there is because a type with
a deleted assignment operator like

  struct E { E& operator=(const E&) = delete; };

is still trivially copyable, but not assignable. We don't want
algorithms like std::ranges::copy to compile because they end up
selecting the memmove path, "ignoring" the fact that E isn't even
copy assignable.

But the static_assert isn't needed here any longer: as noted before,
the ranges algorithms already have the appropriate constraints; and
even if they didn't, there's now a non-discarded codepath to deal with
ranges of length 1 where there is an explicit assignment operation.

Therefore, this commit removes it. (In fact, r13-6372-g822a11a1e642e0
removed the same static_assert from the non-ranges algorithms.)

libstdc++-v3/ChangeLog:

	PR libstdc++/108846
	PR libstdc++/116471
	* include/bits/ranges_algobase.h (__assign_one): New helper
	function.
	(__copy_or_move): Remove a spurious static_assert; use
	__assign_one for memcpyable ranges of length 1.
	(__copy_or_move_backward): Likewise.
	* testsuite/25_algorithms/copy/108846.cc: Extend to range-based
	algorithms, and cover both memcpyable and non-memcpyable
	cases.
	* testsuite/25_algorithms/copy_backward/108846.cc: Likewise.
	* testsuite/25_algorithms/copy_n/108846.cc: Likewise.
	* testsuite/25_algorithms/move/108846.cc: Likewise.
	* testsuite/25_algorithms/move_backward/108846.cc: Likewise.

Signed-off-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
(cherry picked from commit 5938e0681c)
2025-04-16 20:13:34 +01:00
Jonathan Wakely 8c1b7854a4 libstdc++: Add missing header to <bits/ranges_algobase.h> for std::__memcmp
As noticed by Michael Levine.

libstdc++-v3/ChangeLog:

	* include/bits/ranges_algobase.h: Include <bits/stl_algobase.h>.

(cherry picked from commit 674d213ab9)
2025-04-16 20:13:34 +01:00
Jonathan Wakely e2dcab17a3 libstdc++: Fix ranges::iter_move handling of rvalues [PR106612]
The specification for std::ranges::iter_move apparently requires us to
handle types which do not satisfy std::indirectly_readable, for example
with overloaded operator* which behaves differently for different value
categories.

libstdc++-v3/ChangeLog:

	PR libstdc++/106612
	* include/bits/iterator_concepts.h (_IterMove::__iter_ref_t):
	New alias template.
	(_IterMove::__result): Use __iter_ref_t instead of
	std::iter_reference_t.
	(_IterMove::__type): Remove incorrect __dereferenceable
	constraint.
	(_IterMove::operator()): Likewise. Add correct constraints. Use
	__iter_ref_t instead of std::iter_reference_t. Forward parameter
	as correct value category.
	(iter_swap): Add comments.
	* testsuite/24_iterators/customization_points/iter_move.cc: Test
	that iter_move is found by ADL and that rvalue arguments are
	handled correctly.

Reviewed-by: Patrick Palka <ppalka@redhat.com>

(cherry picked from commit a8ee522c59)
2025-04-16 20:13:34 +01:00
Arsen Arsenović 5d1ec58a3a libstdc++: add missing include in ranges_util.h
libstdc++-v3/ChangeLog:

	* include/bits/ranges_util.h: Add missing <bits/invoke.h>
	include.

(cherry picked from commit a6bbaab273)
2025-04-16 20:13:33 +01:00