Commit Graph

460 Commits

Author SHA1 Message Date
Tomasz Kamiński
e16de4a10f libstdc++: Add comment justifying separate proxy_random_access_iterator_wrapper.
It meets Cpp17RandomAccessIterator requirements, but does not satisfy
random_access_iterator concept.

libstdc++-v3/ChangeLog:

	* testsuite/util/testsuite_iterators.h: Modify comment.

Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
2026-01-14 11:43:38 +01:00
Tomasz Kamiński
76ad28b112 libstdc++: Fix handling iterators with proxy subscript in heap algorithms.
This patch replaces uses of subscripts in heap algorithms, that where introduced
in r16-4100-gaaeca77a79a9a8 with dereference of advanced iterators.

The Cpp17RandomAccessIterator requirements, allows operator[] to return any
type that is convertible to reference, however user-provided comparators are
required only to accept result of dereferencing the iterator (i.e. reference
directly). This is visible, when comparator defines operator() for which
template arguments can be deduduced from reference (which will fail on proxy)
or that accepts types convertible from reference (see included tests).

For test we introduce a new proxy_random_access_iterator_wrapper iterator
in testsuite_iterators.h, that returns a proxy type from subscript operator.
This is separate type (instead of additional template argument and aliases),
as it used for test that work with C++98.

libstdc++-v3/ChangeLog:

	* include/bits/stl_heap.h (std::__is_heap_until, std::__push_heap)
	(std::__adjust_heap): Replace subscript with dereference of
	advanced iterator.
	* testsuite/util/testsuite_iterators.h (__gnu_test::subscript_proxy)
	(__gnu_test::proxy_random_access_iterator_wrapper): Define.
	* testsuite/25_algorithms/sort_heap/check_proxy_brackets.cc: New test.

Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
2026-01-13 19:14:26 +01:00
Jakub Jelinek
254a858ae7 Update copyright years. 2026-01-02 09:56:11 +01:00
Jakub Jelinek
62c126db6b libstdc++: Implement C++26 P3378R2 - constexpr exception types
The following patch attempts to implement the C++26 P3378R2 - constexpr
exception types paper.

This is quite complicated, because most of these classes which should
be constexpr-ized use solely or mostly out of line definitions in
libstdc++, both for historical, code size and dual ABI reasons, so that
one can throw these as exceptions between TUs with old vs. new (or vice
versa) ABIs.
For this reason, logic_error/runtime_error and classes derived from it
have the old ABI std::string object inside of them and the exported
APIs from libstdc++.so.6 ensure the right thing.

Now, because new invoked during constant evaluation needs to be deleted
during the same constant evaluation and can't leak into the constant
expressions, I think we don't have to use COW strings under the hood
(which aren't constexpr I guess because of reference counting/COW) and
we can use something else, the patch uses heap allocated std::string
object (where __cow_constexpr_string class has just a pointer to that).
As I think we still want to hide the ugly details if !consteval in the
library, the patch exports 8 __cow_string class symbols (6 existing which
were previously just not exported and 2 new ones) and if !consteval
calls those through extern "C" _Zmangled_name symbols.  The functions
are always_inline.

And then logic_error etc. have for C++26 (precisely for
__cpp_lib_constexpr_exceptions >= 202502L) constexpr definitions of
cdtors/methods.  This results in slightly larger code (a few insns at most)
at runtime for C++26, e.g. instead of calling say some logic error
cdtor/method with 2 arguments it calls some __cow_string one with 2
arguments but + 8 bytes pointer additions on both.

The patch also removes the __throw_format_error forward declaration
which apparently wasn't needed for anything as all __throw_format_error
users were either in <format> or included <format> before the uses,
reverts the
https://gcc.gnu.org/pipermail/libstdc++/2025-July/062598.html
patch and makes sure __throw_* functions (only those for exception types
which the P3378R2 or P3068R5 papers made constexpr usable and there are
actually constexpr/consteval uses of those) are constexpr for C++26
constexpr exceptions.

The patch does that by splitting the bits/functexcept.h header:
1) bits/functexcept.h stays for the __throw_* functions which are (at
least for now) never constexpr (the <ios>, <system_error>, <future>
and <functional> std::exception derived classes) or are never used
or never used in constexpr/consteval contexts (<exception>, <typeinfo>
std::exception derived classes and std::range_error).
2) bits/new_{throw,except}.h for __throw_bad_alloc/__throw_bad_array_new_length
and std::bad_alloc/std::bad_array_new_length (where <new> includes
<bits/new_except.h> and <bits/new_throw.h> as well for the C++26 constexpr
exceptions case)
3) for the most complicated <stdexcept> stuff, one header
addition to bits/stdexcept.h one header for the __throw_logic_error etc.
forward declarations, one header for the __throw_logic_error etc.
definitions and one header without header guards which will
depending on __glibcxx_exc_in_string include one or the other because
<string> vs. <string_view> vs. <stdexcept> have heavy interdependencies

2025-12-11  Jakub Jelinek  <jakub@redhat.com>

	PR libstdc++/121114
libstdc++-v3/
	* include/bits/version.def: Implement C++26 P3378R2 - constexpr
	exception types.
	(constexpr_exceptions): Change value from 1 to 202502, remove
	no_stdname and TODO comments.
	* include/bits/version.h: Regenerate.
	* src/c++11/cow-stdexcept.cc (__cow_string(const char*)): New
	ctor.
	(__cow_string::c_str()): New method.
	* config/abi/pre/gnu.ver (GLIBCXX_3.4.35): Export 8 __cow_string
	symbols.
	* include/bits/new_except.h: New file.
	* include/bits/new_throw.h: New file.
	* include/bits/stdexcept_throw.h: New file.
	* include/bits/stdexcept_throwdef.h: New file.
	* include/bits/stdexcept_throwfwd.h: New file.
	* include/std/stdexcept: Include bits/stdexcept_except.h and move
	everything after <string> include except for std::range_error into
	include/bits/stdexcept_except.h.
	(std::range_error): If __cpp_lib_constexpr_exceptions >= 202502L
	make all cdtors and methods constexpr.
	* include/bits/stdexcept_except.h: New file.
	* include/std/optional (__glibcxx_want_constexpr_exceptions): Define
	before including bits/version.h.
	(bad_optional_access::what): Make constexpr for
	__cpp_lib_constexpr_exceptions >= 202502L.
	(__throw_bad_optional_access): Likewise.
	* include/std/expected (__glibcxx_want_constexpr_exceptions): Define
	before including bits/version.h.
	(bad_expected_access): Make cdtors and all methods constexpr for
	__cpp_lib_constexpr_exceptions >= 202502L.
	* include/std/format (__glibcxx_want_constexpr_exceptions): Define
	before including bits/version.h.
	(_GLIBCXX_CONSTEXPR_FORMAT_ERROR): Define and undef later.
	(format_error): Use _GLIBCXX_CONSTEXPR_FORMAT_ERROR on ctors.
	* include/std/variant (__glibcxx_want_constexpr_exceptions): Define
	before including bits/version.h.
	(_GLIBCXX_CONSTEXPR_BAD_VARIANT_ACCESS): Define and undef later.
	(bad_variant_access): Use it on ctors and what() method.
	(__throw_bad_variant_access): Use it here too.
	* testsuite/18_support/exception/version.cc: Adjust expected
	__cpp_lib_constexpr_exceptions value.
	* testsuite/19_diagnostics/runtime_error/constexpr.cc: New test.
	* testsuite/19_diagnostics/headers/stdexcept/version.cc: New test.
	* testsuite/19_diagnostics/logic_error/constexpr.cc: New test.
	* testsuite/20_util/expected/observers.cc (test_value_throw): Change
	return type to bool from void, return true at the end, add test
	to dereference what() first character.  Make it constexpr for
	__cpp_lib_constexpr_exceptions >= 202502L and add static_assert.
	* testsuite/20_util/expected/version.cc: Add tests for
	__cpp_lib_constexpr_exceptions value.
	* testsuite/20_util/variant/constexpr.cc: For
	__cpp_lib_constexpr_exceptions >= 202502L include <string>.
	(test_get): New function if __cpp_lib_constexpr_exceptions >= 202502L,
	assert calling it is true.
	* testsuite/20_util/variant/version.cc: Add tests for
	__cpp_lib_constexpr_exceptions value.
	* testsuite/20_util/optional/constexpr/observers/3.cc: Include
	testsuite_hooks.h.
	(eat, test01): New functions.  Assert test01() is true.
	* testsuite/20_util/optional/version.cc: Add tests for
	__cpp_lib_constexpr_exceptions value.
	* include/std/future: Add #include <bits/functexcept.h>.
	* include/std/shared_mutex: Include <bits/new_throw.h>.
	* include/std/flat_map: Include <bits/stdexcept_throw.h> instead of
	<bits/functexcept.h>.
	* include/std/syncstream: Remove <bits/functexcept.h> include.
	* include/std/flat_set: Likewise.
	* include/std/bitset: Include <bits/stdexcept_throw.h> instead of
	<bits/functexcept.h>.
	* include/std/string_view: Don't include <bits/functexcept.h>, include
	<bits/stdexcept_throw.h> early if __glibcxx_exc_in_string is not
	defined and include <bits/stdexcept_throw.h> at the end of
	the header again if __glibcxx_exc_in_string is 2 and C++26 constexpr
	exceptions are enabled.
	(__glibcxx_exc_in_string): Define if __glibcxx_exc_in_string wasn't
	defined before including <bits/stdexcept_throw.h>.
	* include/std/array: Include <bits/stdexcept_throw.h> instead of
	<bits/functexcept.h>.
	* include/std/inplace_vector: Likewise.
	* include/std/string: Include <bits/stdexcept_except.h> and
	<bits/stdexcept_throw.h> after bits/basic_string.tcc include if
	C++26 constexpr exceptions are enabled and include
	<bits/stdexcept_throw.h> instead of <bits/functexcept.h> early.
	(__glibcxx_exc_in_string): Define early to 1, undefine at the end.
	* include/std/deque: Include <bits/stdexcept_throw.h>.
	* include/bits/new_allocator.h: Include <bits/new_throw.h> instead
	of <bits/functexcept.h>.
	* include/bits/stl_algobase.h: Remove <bits/functexcept.h> include.
	* include/bits/stl_vector.h: Include <bits/stdexcept_throw.h> instead
	of <bits/functexcept.h>.
	* include/bits/memory_resource.h: Include <bits/new_throw.h> instead
	of <bits/functexcept.h>.
	* include/bits/functexcept.h: Guard everything after includes with
	#if _GLIBCXX_HOSTED.
	(__throw_bad_alloc, __throw_bad_array_new_length,  __throw_logic_error,
	__throw_domain_error, __throw_invalid_argument, __throw_length_error,
	__throw_out_of_range, __throw_out_of_range_fmt, __throw_runtime_error,
	__throw_overflow_error, __throw_underflow_error): Move declarations to
	other headers - <bits/new_throw.h> and <bits/stdexcept_throwfwd.h>.
	* include/bits/stl_map.h: Include <bits/stdexcept_throw.h> instead
	of <bits/functexcept.h>.
	* include/bits/hashtable_policy.h: Include <bits/stdexcept_throw.h>
	instead of <bits/functexcept.h>.
	* include/bits/formatfwd.h (std::__throw_format_error): Remove
	declaration.
	* include/bits/specfun.h: Include <bits/stdexcept_throw.h> instead of
	<bits/functexcept.h>.
	* include/bits/basic_ios.h: Include <bits/functexcept.h>.
	* include/bits/locale_classes.h: Likewise.
	* include/tr1/cmath: Include <bits/stdexcept_throw.h> instead of
	<bits/functexcept.h>.
	* include/tr1/memory: Remove <bits/functexcept.h> include.
	* include/tr1/array: Include <bits/stdexcept_throw.h>.
	* include/ext/vstring_util.h: Include <bits/stdexcept_throw.h> instead
	of <bits/functexcept.h>.
	* include/ext/bitmap_allocator.h: Include <bits/new_throw.h> instead
	of <bits/functexcept.h>.
	* include/ext/mt_allocator.h: Likewise.
	* include/ext/malloc_allocator.h: Likewise.
	* include/ext/debug_allocator.h: Include <bits/stdexcept_throw.h>
	instead of <bits/functexcept.h>.
	* include/ext/concurrence.h: Include <bits/exception_defines.h>
	instead of <bits/functexcept.h>.
	* include/ext/throw_allocator.h: Include <bits/new_throw.h> and
	<bits/stdexcept_throw.h> instead of <bits/functexcept.h>.
	* include/ext/string_conversions.h: Include <bits/stdexcept_throw.h>
	instead of <bits/functexcept.h>.
	* include/ext/pool_allocator.h: Include <bits/new_throw.h> instead
	of <bits/functexcept.h>.
	* include/ext/ropeimpl.h: Include <bits/stdexcept_throw.h> instead of
	<bits/functexcept.h>.
	* include/tr2/dynamic_bitset: Likewise.
	* include/experimental/optional: Include <bits/exception_defines.h>
	instead of <bits/functexcept.h>.
	* include/Makefile.am (bits_freestanding): Add
	${bits_srcdir}/{new,stdexcept}_{except,throw}.h
	and ${bits_srcdir}/stdexcept_throw{fwd,def}.h.
	* include/Makefile.in: Regenerate.
	* src/c++17/floating_from_chars.cc: Remove <bits/functexcept.h>
	include.
	* src/c++11/regex.cc: Likewise.
	* src/c++11/functexcept.cc: Likewise.
	* src/c++11/snprintf_lite.cc: Include <bits/stdexcept_throw.h> instead
	of <bits/functexcept.h>.
	* src/c++11/thread.cc: Include <bits/functexcept.h>.
	* testsuite/util/testsuite_hooks.h: Include <bits/stdexcept_throw.h>
	instead of <bits/functexcept.h>.
	* testsuite/util/io/verified_cmd_line_input.cc: Include
	<bits/exception_defines.h> instead of <bits/functexcept.h>.
	* testsuite/20_util/allocator/105975.cc: Expect different diagnostics
	for C++26.
	* testsuite/23_containers/inplace_vector/access/capacity.cc: Remove
	#error, guard if consteval { return; } with
	#ifndef __cpp_lib_constexpr_exceptions.
	* testsuite/23_containers/inplace_vector/access/elem.cc: Likewise.
	* testsuite/23_containers/inplace_vector/cons/1.cc: Likewise.
	* testsuite/23_containers/inplace_vector/cons/from_range.cc: Likewise.
	* testsuite/23_containers/inplace_vector/modifiers/single_insert.cc:
	Likewise.
	* testsuite/23_containers/inplace_vector/modifiers/assign.cc:
	Likewise.
	* testsuite/23_containers/inplace_vector/modifiers/multi_insert.cc:
	Likewise.
	* libsupc++/new: Include <bits/new_except.h>.
	(std::bad_alloc, std::bad_array_new_length): Move defintion to
	<bits/new_except.h>.
libgomp/
	* omp.h.in: Include <bits/new_throw.h> instead of
	<bits/functexcept.h>.
gcc/testsuite/
	* g++.dg/tree-ssa/pr110819.C: Guard scan-tree-dump-not delete on
	c++23_down and add comment explaining why C++26 fails that.
	* g++.dg/tree-ssa/pr96945.C: Likewise.
	* g++.dg/tree-ssa/pr109442.C: Likewise.
	* g++.dg/tree-ssa/pr116868.C: Likewise.
	* g++.dg/tree-ssa/pr58483.C: Likewise.
2025-12-11 19:54:44 +01:00
François Dumont
8a2e6590cc libstdc++: [_GLIBCXX_DEBUG] Implement std::__debug::inplace_vector
Add _GLIBCXX_DEBUG std::inplace_vector implementation.

libstdc++-v3/ChangeLog:

	* include/Makefile.am (debug_headers): Add inplace_vector.
	* include/Makefile.in: Regenerate.
	* include/debug/functions.h (__check_valid_range): Add C++20 constexpr.
	* include/debug/helper_functions.h (__valid_range): Likewise.
	* include/debug/inplace_vector: New.
	* include/debug/safe_base.h (~_Safe_sequence_base()): Add C++11 noexcept.
	(_Safe_sequence_base::operator=(const _Safe_sequence_base&)): New.
	(_Safe_sequence_base::operator=(_Safe_sequence_base&&)): New.
	(_Safe_sequence_base::_M_invalidate_all): Add C++20 constexpr.
	* include/debug/safe_container.h
	(_Safe_container<>::operator=(const _Safe_container<>&)): Implement using
	_Safe_sequence_base same operator.
	* include/debug/safe_iterator.h (__valid_range): Add C++20 constexpr.
	* include/debug/safe_sequence.h
	(_Not_equal_to(const _Type&)): Add C++20 constexpr.
	(_Equal_to(const _Type&)): Add C++20 constexpr.
	(_After_nth_from(const difference_type&, const _Iterator&)): Add C++20 constexpr.
	(_Safe_sequence<>::_M_invalidate_if): Add C++20 constexpr.
	(_Safe_node_sequence::operator=(const _Safe_node_sequence&)): New.
	(_Safe_node_sequence::operator=(_Safe_node_sequence&&)): New.
	(_Safe_node_sequence<>::_M_invalidate_all()): Add C++20 constexpr.
	* include/debug/safe_sequence.tcc
	(_Safe_sequence<>::_M_invalidate_if): Add C++20 constexpr.
	* include/std/inplace_vector [_GLIBCXX_DEBUG](std::inplace_vector<>): Move
	implementation into __cxx1998 namespace.
	(erase, erase_if): Limit to non-debug inplace_vector<>, cleanup code.
	[_GLIBCXX_DEBUG]: Add include <debug/inplace_vector>.
	* testsuite/23_containers/inplace_vector/cons/1.cc: Adapt, skip several
	is_trivially_xxx checks when in _GLIBCXX_DEBUG mode.
	* testsuite/23_containers/inplace_vector/copy.cc: Likewise.
	* testsuite/23_containers/inplace_vector/move.cc: Likewise.
	* testsuite/23_containers/inplace_vector/debug/assign1_neg.cc: New test case.
	* testsuite/23_containers/inplace_vector/debug/assign2_neg.cc: New test case.
	* testsuite/23_containers/inplace_vector/debug/assign3_neg.cc: New test case.
	* testsuite/23_containers/inplace_vector/debug/assign4_backtrace_neg.cc: New test case.
	* testsuite/23_containers/inplace_vector/debug/assign4_neg.cc: New test case.
	* testsuite/23_containers/inplace_vector/debug/construct1_neg.cc: New test case.
	* testsuite/23_containers/inplace_vector/debug/construct2_neg.cc: New test case.
	* testsuite/23_containers/inplace_vector/debug/construct3_neg.cc: New test case.
	* testsuite/23_containers/inplace_vector/debug/construct4_neg.cc: New test case.
	* testsuite/23_containers/inplace_vector/debug/debug_functions.cc: New test case.
	* testsuite/23_containers/inplace_vector/debug/erase.cc: New test case.
	* testsuite/23_containers/inplace_vector/debug/insert1_neg.cc: New test case.
	* testsuite/23_containers/inplace_vector/debug/insert2_neg.cc: New test case.
	* testsuite/23_containers/inplace_vector/debug/insert3_neg.cc: New test case.
	* testsuite/23_containers/inplace_vector/debug/insert4_neg.cc: New test case.
	* testsuite/23_containers/inplace_vector/debug/insert5_neg.cc: New test case.
	* testsuite/23_containers/inplace_vector/debug/insert7_neg.cc: New test case.
	* testsuite/23_containers/inplace_vector/debug/invalidation/1.cc: New test case.
	* testsuite/23_containers/inplace_vector/debug/invalidation/2.cc: New test case.
	* testsuite/23_containers/inplace_vector/debug/invalidation/3.cc: New test case.
	* testsuite/23_containers/inplace_vector/debug/invalidation/4.cc: New test case.
	* testsuite/23_containers/inplace_vector/debug/invalidation/append_range.cc:
	New test case.
	* testsuite/23_containers/inplace_vector/debug/invalidation/erase.cc:
	New test case.
	* testsuite/23_containers/inplace_vector/debug/invalidation/pop_back.cc:
	New test case.
	* testsuite/23_containers/inplace_vector/debug/invalidation/push_back.cc:
	New test case.
	* testsuite/23_containers/inplace_vector/debug/invalidation/swap.cc:
	New test case.
	* testsuite/23_containers/inplace_vector/debug/invalidation/try_append_range.cc:
	New test case.
	* testsuite/23_containers/inplace_vector/debug/invalidation/try_emplace_back.cc:
	New test case.
	* testsuite/23_containers/inplace_vector/debug/invalidation/try_push_back.cc:
	New test case.
	* testsuite/23_containers/inplace_vector/debug/invalidation/unchecked_emplace_back.cc:
	New test case.
	* testsuite/util/debug/checks.h: Avoid using _GLIBCXX_DEBUG containers in test
	implementations.
2025-12-03 06:56:27 +01:00
Jason Merrill
359d48af20 libstdc++: testsuite/util adjustments for import std
In my import std testing patch, to work around c++/99000 (include after
import) I move #includes of the util/ headers above the import.  And so I
made some adjustments to those headers to support this: adding some missing
dependencies, making sure that in headers that include both importable and
non-importable headers, at least one importable header comes first to work
with my patch to translate e.g. #include <vector> to import <bits/stdc++.h>.

The testsuite_iterators.h avoids a failure in
20_util/specialized_algorithms/uninitialized_copy/constrained.cc from
including <memory> after this header, with a mysterious "no match for
operator<" between long and difference_type.

libstdc++-v3/ChangeLog:

	* testsuite/util/testsuite_allocator.h: Move importable headers up.
	* testsuite/util/testsuite_common_types.h: Likewise.
	* testsuite/util/testsuite_containers.h: Likewise.
	* testsuite/util/testsuite_error.h: Move includes inside
	include guard.
	* testsuite/util/testsuite_greedy_ops.h: #include <cstddef>.
	* testsuite/util/testsuite_iterators.h: #include <utility>.
	* testsuite/util/testsuite_new_operators.h: #include <cstdlib>.
	* testsuite/util/testsuite_random.h: #include <random>.
2025-11-17 21:26:40 +05:30
Jason Merrill
eaf6b40f76 libstdc++: remove cassert from stdc++.h
<cassert> isn't suitable for a header unit, because by design it depends on
the user NDEBUG macro.  So let's not include it in <bits/stdc++.h>.

libstdc++-v3/ChangeLog:

	* include/precompiled/stdc++.h: Remove <cassert>.
	* testsuite/util/exception/safety.h: Add <cassert>.
	* testsuite/17_intro/headers/c++1998/stdc++_assert_neg.cc:
	Don't define _GLIBCXX_NO_ASSERT.
2025-11-03 18:55:06 +03:00
Jonathan Wakely
93b8d6e4d2 libstdc++: Add typedefs to __gnu_test::test_container utility
libstdc++-v3/ChangeLog:

	* testsuite/util/testsuite_iterators.h (test_container): Add
	iterator and value_type typedefs.

Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-10-27 09:54:50 +00:00
Jonathan Wakely
152f4daab4 libstdc++: Fix allocator propagation and tests for std::indirect and std::polymorphic
I noticed that several tests were doing:

static_assert([] { /* ... */; return true; });

i.e. just testing a lambda, not invoking it and testing the result. This
change fixes that, so that all the lambdas are invoked.

After fixing that, most of the tests failed because they were using
__gnu_test::tracker_allocator or std::scoped_allocator_adaptor in
constexpr functions. The tracker_allocator modifies global state, so can
never be constexpr, and none of std::scoped_allocator_adaptor's members
are marked constexpr.

This change makes __gnu_test::uneq_allocator and
__gnu_test::propagating_allocator usable in constant expressions, which
allows some of the tests which can't be constexpr to be duplicated to
new functions which use uneq_allocator or propagating_allocator instead
of tracker_allocator. This new functions can be tested with the
static_assert calling a lambda.

In some cases none of the tests could be adapted to be constexpr, so the
static_assert and lambda were just removed.

Two changes were also needed for the actual library code, because the
move assignment operators for std::indirect and std::polymorphic were
using copy-assignment on the allocator. Although the semantics of
move-assignment for allocators should be equivalent to copy-assignment,
an allocator isn't actually required to support copy-assignment unless
propagate_on_container_copy_assignment is true. So we have to use
move-assignment for propagate_on_container_move_assignment cases.

libstdc++-v3/ChangeLog:

	* include/bits/indirect.h (indirect::operator=(indirect&&)):
	Move assign allocator when POCMA is true.
	(polymorphic::operator=(polymorphic&&)): Likewise.
	* testsuite/std/memory/indirect/copy.cc: Remove constexpr from
	functions that use tracker_allocator. Add test_constexpr().
	* testsuite/std/memory/indirect/copy_alloc.cc: Remove constexpr
	from all functions and remove static_assert.
	* testsuite/std/memory/indirect/ctor.cc: Do not use
	scoped_allocator_adaptor during constant evaluation.
	* testsuite/std/memory/indirect/move.cc: Remove constexpr from
	functions that use tracker_allocator. Add test_constexpr().
	* testsuite/std/memory/indirect/move_alloc.cc: Remove constexpr
	from all functions and remove static_assert.
	* testsuite/std/memory/indirect/relops.cc: Invoke lambda in
	static_assert.
	* testsuite/std/memory/polymorphic/copy.cc: Remove constexpr
	from functions that use tracker_allocator. Add test_constexpr().
	* testsuite/std/memory/polymorphic/copy_alloc.cc: Remove
	constexpr from all functions and remove static_assert.
	* testsuite/std/memory/polymorphic/ctor.cc: Do not use
	scoped_allocator_adaptor during constant evaluation.
	* testsuite/std/memory/polymorphic/ctor_poly.cc: Likewise.
	* testsuite/std/memory/polymorphic/move.cc: Remove constexpr
	from functions that use tracker_allocator. Add test_constexpr().
	* testsuite/std/memory/polymorphic/move_alloc.cc: Remove
	constexpr from all functions and remove static_assert.
	* testsuite/util/testsuite_allocator.h (tracker_allocator):
	Remove redundant 'inline' from friend.
	(uneq_allocator): Make all functions constexpr.
	(uneq_allocator::base, uneq_allocator::swap_base): Remove.
	(uneq_allocator::~uneq_allocator): Remove.
	(uneq_allocator::allocate, uneq_allocator::deallocate): Do not
	use map of allocations during constant evaluation.
	(propagating_allocator): Make all functions constexpr.
	(propagating_allocator::base): Remove.
	(propagating_allocator::swap_base): Simplify.
	(ExplicitConsAlloc, CustomPointerAlloc, NullablePointer): Add
	constexpr to all functions.

Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-10-08 17:06:20 +01:00
Jonathan Wakely
7b99d184bc libstdc++: Fix algorithms to use iterators' difference_type for arithmetic [PR121890]
Whenever we use operator+ or similar operators on random access
iterators we need to be careful to use the iterator's difference_type
rather than some other integer type. It's not guaranteed that an
expression with an arbitrary integer type, such as `it + 1u`, has the
same effects as `it + iter_difference_t<It>(1)`.

Some of our algorithms need changes to cast values to the correct type,
or to use std::next or ranges::next instead of `it + n`. Several tests
also need fixes where the arithmetic occurs directly in the test.

The __gnu_test::random_access_iterator_wrapper class template is
adjusted to have deleted operators that make programs ill-formed if the
argument to relevant operators is not the difference_type. This will
make it easier to avoid regressing in future.

libstdc++-v3/ChangeLog:

	PR libstdc++/121890
	* include/bits/ranges_algo.h (ranges::rotate, ranges::shuffle)
	(__insertion_sort, __unguarded_partition_pivot, __introselect):
	Use ranges::next to advance iterators. Use local variables in
	rotate to avoid duplicate expressions.
	(ranges::push_heap, ranges::pop_heap, ranges::partial_sort)
	(ranges::partial_sort_copy): Use ranges::prev.
	(__final_insertion_sort): Use iter_difference_t<Iter>
	for operand of operator+ on iterator.
	* include/bits/ranges_base.h (ranges::advance): Use iterator's
	difference_type for all iterator arithmetic.
	* include/bits/stl_algo.h (__search_n_aux, __rotate)
	(__insertion_sort, __unguarded_partition_pivot, __introselect)
	(__final_insertion_sort, for_each_n, random_shuffle): Likewise.
	Use local variables in __rotate to avoid duplicate expressions.
	* include/bits/stl_algobase.h (__fill_n_a, __lc_rai::__newlast1):
	Likewise.
	* include/bits/stl_heap.h (push_heap): Likewise.
	(__is_heap_until): Add static_assert.
	(__is_heap): Convert distance to difference_type.
	* include/std/functional (boyer_moore_searcher::operator()): Use
	iterator's difference_type for iterator arithmetic.
	* testsuite/util/testsuite_iterators.h
	(random_access_iterator_wrapper): Add deleted overloads of
	operators that should be called with difference_type.
	* testsuite/24_iterators/range_operations/advance.cc: Use
	ranges::next.
	* testsuite/25_algorithms/heap/constrained.cc: Use ranges::next
	and ranges::prev.
	* testsuite/25_algorithms/nth_element/58800.cc: Use std::next.
	* testsuite/25_algorithms/nth_element/constrained.cc: Use
	ptrdiff_t for loop variable.
	* testsuite/25_algorithms/nth_element/random_test.cc: Use
	iterator's difference_type instead of int.
	* testsuite/25_algorithms/partial_sort/check_compare_by_value.cc:
	Use std::next.
	* testsuite/25_algorithms/partial_sort/constrained.cc: Use
	ptrdiff_t for loop variable.
	* testsuite/25_algorithms/partial_sort/random_test.cc: Use
	iterator's difference_type instead of int.
	* testsuite/25_algorithms/partial_sort_copy/constrained.cc:
	Use ptrdiff_t for loop variable.
	* testsuite/25_algorithms/partial_sort_copy/random_test.cc:
	Use iterator's difference_type instead of int.
	* testsuite/std/ranges/adaptors/drop.cc: Use ranges::next.
	* testsuite/25_algorithms/fill_n/diff_type.cc: New test.
	* testsuite/25_algorithms/lexicographical_compare/diff_type.cc:
	New test.

Reviewed-by: Patrick Palka <ppalka@redhat.com>
Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-09-12 21:46:48 +01:00
Tomasz Kamiński
be6a864b25 libstdc++: Expand compile-time ranges tests for vector and basic_string.
This replaces most test_constexpr invocations with direct calls to
test_ranges(), which is also used for runtime tests.

SimpleAllocator was made constexpr to simplify this refactoring. Other
test allocators, like uneq_allocator (used in from_range constructor
tests), were not updated.

libstdc++-v3/ChangeLog:

	* testsuite/21_strings/basic_string/cons/from_range.cc: Replace
	test_constexpr with test_ranges inside static_assert.
	* testsuite/21_strings/basic_string/modifiers/append/append_range.cc:
	Likewise.
	* testsuite/21_strings/basic_string/modifiers/assign/assign_range.cc:
	Likewise.
	* testsuite/21_strings/basic_string/modifiers/insert/insert_range.cc:
	Likewise.
	* testsuite/21_strings/basic_string/modifiers/replace/replace_with_range.cc:
	Likewise.
	* testsuite/23_containers/vector/bool/cons/from_range.cc: Likewise.
	* testsuite/23_containers/vector/bool/modifiers/assign/assign_range.cc:
	Likewise.
	* testsuite/23_containers/vector/bool/modifiers/insert/insert_range.cc:
	Likewise.
	* testsuite/23_containers/vector/cons/from_range.cc: Likewise.
	* testsuite/23_containers/vector/modifiers/assign/assign_range.cc:
	Likewise.
	* testsuite/23_containers/vector/modifiers/insert/insert_range.cc:
	Likewise.
	* testsuite/23_containers/vector/bool/modifiers/insert/append_range.cc:
	Run full test_ranges instead of span-only in test_constexpr.
	* testsuite/23_containers/vector/modifiers/append_range.cc:
	Replace test_constexpr with calls to test_ranges and test_overlapping.
	* testsuite/util/testsuite_allocator.h (__gnu_test::SimpleAllocator):
	Declared member functions as constexpr.
2025-07-24 15:13:46 +02:00
Tomasz Kamiński
f59cb28d53 libstdc++: Make testsuite_iterators constexpr and expand inplace_vector tests [PR119137]
All functions in testsuite_iterators.h are now marked constexpr,
targeting the earliest possible standard. Most functions use C++14 due
to multi-statement bodies, with exceptions:

* BoundsContainer and some constructors are C++11 compatible.
* OutputContainer is C++20 due to operator new/delete usage.

Before C++23, each constexpr templated function requires a constexpr
-suitable instantiation. Functions delegating to _GLIBCXX14_CONSTEXPR
must also be _GLIBCXX14_CONSTEXPR; e.g., forward_iterator_wrapper's
constructor calling input_iterator_wrapper's constructor, or
operator-> calling operator*.

For classes defined C++20 or later (e.g., test_range), constexpr is
applied unconditionally.

	PR libstdc++/119137

libstdc++-v3/ChangeLog:

	* testsuite/23_containers/inplace_vector/cons/from_range.cc: Run
	iterators and range test at compile-time.
	* testsuite/23_containers/inplace_vector/modifiers/assign.cc:
	Likewise.
	* testsuite/23_containers/inplace_vector/modifiers/multi_insert.cc:
	Likewise.
	* testsuite/util/testsuite_iterators.h (__gnu_test::BoundsContainer)
	(__gnu_test::OutputContainer, __gnu_test::WritableObject)
	(__gnu_test::output_iterator_wrapper, __gnu_test::input_iterator_wrapper)
	(__gnu_test::forward_iterator_wrapper)
	(__gnu_test::bidirectional_iterator_wrapper)
	(__gnu_test::random_access_iterator_wrapper)
	(__gnu_test::test_container): Add appropriate _GLIBCXXNN_CONSTEXPR
	macros to member functions.
	(__gnu_test::contiguous_iterator_wrapper)
	(__gnu_test::input_iterator_wrapper_rval)
	(__gnu_test::test_range, __gnu_test::test_range_nocopy)
	(__gnu_test::test_sized_range_sized_sent)
	(__gnu_test::test_sized_range): Add constexpr specifier to member
	functions.
2025-07-22 16:13:12 +02:00
Jonathan Wakely
9e33097738 libstdc++: Add std::inplace_vector for C++26 (P0843R14) [PR119137]
Implement std::inplace_vector as specified in P0843R14, without follow
up papers, in particular P3074R7 (trivial unions). In consequence
inplace_vector<T, N> can be used inside constant evaluations only
if T is trivial or N is equal to zero.

We provide a separate specialization for inplace_vector<T, 0> to meet
the requirements of N5008 [inplace.vector.overview] p5. In particular
objects of such types needs to be empty.

To allow constexpr variable of inplace_vector v, where v.size() < v.capacity(),
we need to guaranteed that all elements of the storage array are initialized,
even ones in range [v.data() + v.size(), v.data() + v.capacity()). This is
perfoirmed by _M_init function, that is called by each constructor. By storing
the array in anonymous union, we can perform this initialization in constant
evaluation, avoiding the impact on runtime path.

The size() function conveys the information that _M_size <= _Nm to compiler,
by calling __builtin_unreachable(). In particular this allows us to eliminate
FP warnings by using _Nm - size() instead of _Nm - _M_size, when computing
available elements.

The included test cover almost all code paths at runtime, however some
compile time evaluation test are not yet implemented:
* operations on range, they depend on making testsuite_iterators constexpr
* negative test for invoking operations with preconditions at compile time,
  especially for zero size specialization.

	PR libstdc++/119137

libstdc++-v3/ChangeLog:

	* doc/doxygen/user.cfg.in (INPUT): Add new header.
	* include/Makefile.am: Add new header.
	* include/Makefile.in: Regenerate.
	* include/bits/stl_iterator_base_types.h (__any_input_iterator):
	Define.
	* include/bits/version.def (inplace_vector): Define.
	* include/bits/version.h: Regenerate.
	* include/precompiled/stdc++.h: Include new header.
	* src/c++23/std.cc.in: Export contents if new header.
	* include/std/inplace_vector: New file.
	* testsuite/23_containers/inplace_vector/access/capacity.cc: New file.
	* testsuite/23_containers/inplace_vector/access/elem.cc: New file.
	* testsuite/23_containers/inplace_vector/access/elem_neg.cc: New file.
	* testsuite/23_containers/inplace_vector/cons/1.cc: New file.
	* testsuite/23_containers/inplace_vector/cons/from_range.cc: New file.
	* testsuite/23_containers/inplace_vector/cons/throws.cc: New file.
	* testsuite/23_containers/inplace_vector/copy.cc: New file.
	* testsuite/23_containers/inplace_vector/erasure.cc: New file.
	* testsuite/23_containers/inplace_vector/modifiers/assign.cc: New file.
	* testsuite/23_containers/inplace_vector/modifiers/erase.cc: New file.
	* testsuite/23_containers/inplace_vector/modifiers/multi_insert.cc:
	New file.
	* testsuite/23_containers/inplace_vector/modifiers/single_insert.cc:
	New file.
	* testsuite/23_containers/inplace_vector/move.cc: New file.
	* testsuite/23_containers/inplace_vector/relops.cc: New file.
	* testsuite/23_containers/inplace_vector/version.cc: New file.
	* testsuite/util/testsuite_iterators.h (input_iterator_wrapper::base):
	Define.

Reviewed-by: Patrick Palka <ppalka@redhat.com>
Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
Co-authored-by: Tomasz Kamiński <tkaminsk@redhat.com>
Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-07-18 09:49:34 +02:00
François Dumont
2fd6f42c17 libstdc++: Make debug iterator pointer sequence const [PR116369]
In revision a35dd276cb the debug sequence
have been made mutable to allow attach iterators to const containers.
This change completes this fix by also declaring debug unordered container
members mutable.

Additionally the debug iterator sequence is now a pointer-to-const and so
_Safe_sequence_base _M_attach and all other methods are const qualified.
Not-const methods exported are preserved for abi backward compatibility.

libstdc++-v3/ChangeLog:

	PR c++/116369
	* config/abi/pre/gnu-versioned-namespace.ver: Use new const qualified symbols.
	* config/abi/pre/gnu.ver: Add new const qualified symbols.
	* include/debug/safe_base.h
	(_Safe_iterator_base::_M_sequence): Declare as pointer-to-const.
	(_Safe_iterator_base::_M_attach, _M_attach_single): New, take pointer-to-const
	_Safe_sequence_base.
	(_Safe_sequence_base::_M_detach_all, _M_detach_singular, _M_revalidate_singular)
	(_M_swap, _M_get_mutex): New, const qualified.
	(_Safe_sequence_base::_M_attach, _M_attach_single, _M_detach, _M_detach_single):
	const qualify.
	* include/debug/safe_container.h (_Safe_container<>::_M_cont): Add const qualifier.
	(_Safe_container<>::_M_swap_base): New.
	(_Safe_container(_Safe_container&&, const _Alloc&, std::false_type)):
	Adapt to use latter.
	(_Safe_container<>::operator=(_Safe_container&&)): Likewise.
	(_Safe_container<>::_M_swap): Likewise and take parameter as const reference.
	* include/debug/safe_unordered_base.h
	(_Safe_local_iterator_base::_M_safe_container): New.
	(_Safe_local_iterator_base::_Safe_local_iterator_base): Take
	_Safe_unordered_container_base as pointer-to-const.
	(_Safe_unordered_container_base::_M_attach, _M_attach_single): New, take
	container as _Safe_unordered_container_base pointer-to-const.
	(_Safe_unordered_container_base::_M_local_iterators, _M_const_local_iterators):
	Add mutable.
	(_Safe_unordered_container_base::_M_detach_all, _M_swap): New, const qualify.
	(_Safe_unordered_container_base::_M_attach_local, _M_attach_local_single)
	(_M_detach_local, _M_detach_local_single): Add const qualifier.
	* include/debug/safe_unordered_container.h (_Safe_unordered_container::_M_self()): New.
	* include/debug/safe_unordered_container.tcc
	(_Safe_unordered_container::_M_invalidate_if, _M_invalidated_local_if): Use latter.
	* include/debug/safe_iterator.h (_Safe_iterator<>::_M_attach, _M_attach_single):
	Take _Safe_sequence_base as pointer-to-const.
	(_Safe_iterator<>::_M_get_sequence): Add const_cast and comment about it.
	* include/debug/safe_local_iterator.h (_Safe_local_iterator<>): Replace usages
	of _M_sequence member by _M_safe_container().
	(_Safe_local_iterator<>::_M_attach, _M_attach_single): Take
	_Safe_unordered_container_base as pointer-to-const.
	(_Safe_local_iterator<>::_M_get_sequence): Rename into...
	(_Safe_local_iterator<>::_M_get_ucontainer): ...this. Add necessary const_cast and
	comment to explain it.
	(_Safe_local_iterator<>::_M_is_begin, _M_is_end): Adapt.
	* include/debug/safe_local_iterator.tcc: Adapt.
	* include/debug/safe_sequence.h
	(_Safe_sequence<>::_M_invalidate_if, _M_transfer_from_if): Add const qualifier.
	* include/debug/safe_sequence.tcc: Adapt.
	* include/debug/deque (std::__debug::deque::erase): Adapt to use new const
	qualified methods.
	* include/debug/formatter.h: Adapt.
	* include/debug/forward_list (_Safe_forward_list::_M_this): Add const
	qualification and return pointer for consistency with 'this' keyword.
	(_Safe_forward_list::_M_swap_aux): Rename into...
	(_Safe_forward_list::_S_swap_aux): ...this and take sequence as const reference.
	(forward_list<>::resize): Adapt to use const methods.
	* include/debug/list (list<>::resize): Likewise.
	* src/c++11/debug.cc: Adapt to const qualification.
	* testsuite/util/testsuite_containers.h
	(forward_members_unordered::forward_members_unordered): Add check on local_iterator
	conversion to const_local_iterator.
	(forward_members::forward_members): Add check on iterator conversion to
	const_iterator.
	* testsuite/23_containers/unordered_map/const_container.cc: New test case.
	* testsuite/23_containers/unordered_multimap/const_container.cc: New test case.
	* testsuite/23_containers/unordered_multiset/const_container.cc: New test case.
	* testsuite/23_containers/unordered_set/const_container.cc: New test case.
	* testsuite/23_containers/vector/debug/mutex_association.cc: Adapt.
2025-07-08 07:04:00 +02:00
Jonathan Wakely
5ca5e1d54f libstdc++: Make VERIFY a variadic macro
This defines the testsuite assertion macro VERIFY so that it allows
un-parenthesized expressions containing commas. This matches how assert
is defined in C++26, following the approval of P2264R7.

The primary motivation is to allow expressions that the preprocessor
splits into multiple arguments, e.g.
VERIFY( vec == std::vector<int>{1,2,3,4} );

To achieve this, VERIFY is redefined as a variadic macro and then the
arguments are grouped together again through the use of __VA_ARGS__.

The implementation is complex due to the following points:

- The arguments __VA_ARGS__ are contextually-converted to bool, so that
  scoped enums and types that are not contextually convertible to bool
  cannot be used with VERIFY.
- bool(__VA_ARGS__) is used so that multiple arguments (i.e. those which
  are separated by top-level commas) are ill-formed. Nested commas are
  allowed, but likely mistakes such as VERIFY( cond, "some string" ) are
  ill-formed.
- The bool(__VA_ARGS__) expression needs to be unevaluated, so that we
  don't evaluate __VA_ARGS__ more than once. The simplest way to do that
  would be just sizeof bool(__VA_ARGS__), without parentheses to avoid a
  vexing parse for VERIFY(bool(i)). However that wouldn't work for e.g.
  VERIFY( []{ return true; }() ), because lambda expressions are not
  allowed in unevaluated contexts until C++20. So we use another
  conditional expression with bool(__VA_ARGS__) as the unevaluated
  operand.

libstdc++-v3/ChangeLog:

	* testsuite/util/testsuite_hooks.h (VERIFY): Define as variadic
	macro.
	* testsuite/ext/verify_neg.cc: New test.

Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-07-07 21:50:50 +01:00
Jakub Jelinek
af5b72cf9f libstdc++: Implement C++26 P2927R3 - Inspecting exception_ptr
The following patch attempts to implement the C++26 P2927R3 - Inspecting exception_ptr
paper (but not including P3748R0, I plan to play with it incrementally and
it will really depend on the Constexpr exceptions patch).

The function template is implemented using an out of line private method of
exception_ptr, so that P3748R0 then can use if consteval and provide a
constant evaluation variant of it.

2025-06-26  Jakub Jelinek  <jakub@redhat.com>

	* include/bits/version.def (exception_ptr_cast): Add.
	* include/bits/version.h: Regenerate.
	* libsupc++/exception: Define __glibcxx_want_exception_ptr_cast before
	including bits/version.h.
	* libsupc++/exception_ptr.h (std::exception_ptr_cast): Define.
	(std::__exception_ptr::exception_ptr::_M_exception_ptr_cast): Declare.
	* libsupc++/eh_ptr.cc
	(std::__exception_ptr::exception_ptr::_M_exception_ptr_cast): Define.
	* src/c++23/std.cc.in (std::exception_ptr_cast): Export.
	* config/abi/pre/gnu.ver: Export
	_ZNKSt15__exception_ptr13exception_ptr21_M_exception_ptr_castERKSt9type_info
	at CXXABI_1.3.17.
	* testsuite/util/testsuite_abi.cc (check_version): Allow CXXABI_1.3.17.
	* testsuite/18_support/exception_ptr/exception_ptr_cast.cc: New test.
2025-06-26 16:18:38 +02:00
Jonathan Wakely
da9b2ea04c libstdc++: Move atomic wait/notify entry points into the library
This moves the implementation details of atomic wait/notify functions
into the library, so that only a small API surface is exposed to users.

This also fixes some race conditions present in the design for proxied
waits:

- The stores to _M_ver in __notify_impl must be protected by the mutex,
  and the loads from _M_ver in __wait_impl and __wait_until_impl to
  check for changes must also be protected by the mutex. This ensures
  that checking _M_ver for updates and waiting on the condition_variable
  happens atomically. Otherwise it's possible to have: _M_ver == old
  happens-before {++_M_ver; cv.notify;} which happens-before cv.wait.
  That scenario results in a missed notification, and so the waiting
  function never wakes. This wasn't a problem for Linux, because the
  futex wait call re-checks the _M_ver value before sleeping, so the
  increment cannot interleave between the check and the wait.

- The initial load from _M_ver that reads the 'old' value used for the
  _M_ver == old checks must be done before loading and checking the
  value of the atomic variable. Otherwise it's possible to have:
  var.load() == val happens-before {++_M_ver; _M_cv.notify_all();}
  happens-before {old = _M_ver; lock mutex; if (_M_ver == old) cv.wait}.
  This results in the waiting thread seeing the already-incremented
  value of _M_ver and then waiting for it to change again, which doesn't
  happen. This race was present even for Linux, because using a futex
  instead of mutex+condvar doesn't prevent the increment from happening
  before the waiting threads checks for the increment.

The first race can be solved locally in the waiting and notifying
functions, by acquiring the mutex lock earlier in the function. The
second race cannot be fixed locally, because the load of the atomic
variable and the check for updates to _M_ver happen in different
functions (one in a function template in the headers and one in the
library). We do have an _M_old data member in the __wait_args_base
struct which was previously only used for non-proxy waits using a futex.
We can add a new entry point into the library to look up the waitable
state for the address and then load its _M_ver into the _M_old member.
This allows the inline function template to ensure that loading _M_ver
happens-before testing whether the atomic variable has been changed, so
that we can reliably tell if _M_ver changes after we've already tested
the atomic variable. This isn't 100% reliable, because _M_ver could be
incremented 2^32 times and wrap back to the same value, but that seems
unlikely in practice. If/when we support waiting on user-defined
predicates (which could execute long enough for _M_ver to wrap) we might
want to always wait with a timeout, so that we get a chance to re-check
the predicate even in the rare case that _M_ver wraps.

Another change is to make the __wait_until_impl function take a
__wait_clock_t::duration instead of a __wait_clock_t::time_point, so
that the __wait_until_impl function doesn't depend on the symbol name of
chrono::steady_clock. Inside the library it can be converted back to a
time_point for the clock. This would potentially allow using a different
clock, if we made a different __abi_version in the __wait_args imply
waiting with a different clock.

This also adds a void* to the __wait_args_base structure, so that
__wait_impl can store the __waitable_state* in there the first time it's
looked up for a given wait, so that it doesn't need to be retrieved
again on each loop. This requires passing the __wait_args_base structure
by non-const reference.

The __waitable_state::_S_track function can be removed now that it's all
internal to the library, and namespace-scope RAII types added for
locking and tracking contention.

libstdc++-v3/ChangeLog:

	* config/abi/pre/gnu.ver: Add new symbol version and exports.
	* include/bits/atomic_timed_wait.h (__platform_wait_until): Move
	to atomic.cc.
	(__cond_wait_until, __spin_until_impl): Likewise.
	(__wait_until_impl): Likewise. Change __wait_args_base parameter
	to non-const reference and change third parameter to
	__wait_clock_t::duration.
	(__wait_until): Change __wait_args_base parameter to non-const
	reference. Change Call time_since_epoch() to get duration from
	time_point.
	(__wait_for): Change __wait_args_base parameter to non-const
	reference.
	(__atomic_wait_address_until): Call _M_prep_for_wait_on on args.
	(__atomic_wait_address_for): Likewise.
	(__atomic_wait_address_until_v): Qualify call to avoid ADL. Do
	not forward __vfn.
	* include/bits/atomic_wait.h (__platform_wait_uses_type): Use
	alignof(T) not alignof(T*).
	(__futex_wait_flags, __platform_wait, __platform_notify)
	(__waitable_state, __spin_impl, __notify_impl): Move to
	atomic.cc.
	(__wait_impl): Likewise. Change __wait_args_base parameter to
	non-const reference.
	(__wait_args_base::_M_wait_state): New data member.
	(__wait_args_base::_M_prep_for_wait_on): New member function.
	(__wait_args_base::_M_load_proxy_wait_val): New member
	function.
	(__wait_args_base::_S_memory_order_for): Remove member function.
	(__atomic_wait_address): Call _M_prep_for_wait_on on args.
	(__atomic_wait_address_v): Qualify call to avoid ADL.
	* src/c++20/Makefile.am: Add new file.
	* src/c++20/Makefile.in: Regenerate.
	* src/c++20/atomic.cc: New file.
	* testsuite/17_intro/headers/c++1998/49745.cc: Remove XFAIL for
	C++20 and later.
	* testsuite/29_atomics/atomic/wait_notify/100334.cc: Remove use
	of internal implementation details.
	* testsuite/util/testsuite_abi.cc: Add GLIBCXX_3.4.35 version.
2025-05-30 10:02:28 +01:00
Jonathan Wakely
c0a2526f09 libstdc++: Fix PSTL test iterators
These were fixed upstream by:
https://github.com/uxlfoundation/oneDPL/pull/534
https://github.com/uxlfoundation/oneDPL/pull/546

libstdc++-v3/ChangeLog:

	* testsuite/util/pstl/test_utils.h (ForwardIterator::operator++):
	Fix return type.
	(BidirectionalIterator::operator++): Likewise.
	(BidirectionalIterator::operator--): Likewise.
2025-05-22 12:13:55 +01:00
Jonathan Wakely
869accb241 libstdc++: Make __gnu_test::default_init_allocator usable in constexpr
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-02 11:53:22 +01:00
François Dumont
2fb6ddd458 libstdc++: Add std::deque<>::shrink_to_fit test
The existing test is currently testing std::vector. Adapt it for std::deque.

libstdc++-v3/ChangeLog:

	* testsuite/util/replacement_memory_operators.h: Adapt for -fno-exceptions
	context.
	* testsuite/23_containers/deque/capacity/shrink_to_fit.cc: Adapt test
	to check std::deque shrink_to_fit method.

Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
Reviewed-by: Tomasz Kaminski <tkaminsk@redhat.com>
2025-04-24 18:05:32 +02:00
Andreas Schwab
b16b0a7ae8 libstdc++: Finalize GCC 15 ABI
Disallow adding new symbols to GLIBCXX_3.4.34 and CXXABI_1.3.16 versions.

	* testsuite/util/testsuite_abi.cc (check_version): Update latestp
	to use GLIBCXX_3.4.35 and CXXABI_1.3.17.
2025-04-22 11:18:22 +02:00
François Dumont
9662c9526f libstdc++: Add _GLIBCXX_DEBUG checks on unordered container local_iterator
Complete tests on  _GLIBCXX_DEBUG checks in include/debug/safe_local_iterator.h.

Fix several tests not testing the container corresponding to their location in the
testsuite directory.

libstdc++-v3/ChangeLog:

	* testsuite/util/debug/unordered_checks.h (fill_container): New helper method.
	(use_erased_local_iterator, invalid_local_iterator_pre_increment)
	(invalid_local_iterator_post_increment, invalid_local_iterator_compare)
	(invalid_local_iterator_range): Use latter.
	(fill_and_get_local_iterator): New, use fill_container.
	(use_invalid_local_iterator): Use latter.
	(invalid_local_iterator_arrow_operator): New test function.
	(invalid_local_iterator_copy_instantiation): New test function.
	(invalid_local_iterator_move_instantiation): New test function.
	(invalid_local_iterator_copy_assignment): New test function.
	(invalid_local_iterator_move_assignment): New test function.
	(invalid_local_iterator_const_conversion): New test function.
	* testsuite/23_containers/unordered_map/debug/invalid_local_iterator_arrow_operator_neg.cc:
	New test case.
	* testsuite/23_containers/unordered_map/debug/invalid_local_iterator_const_conversion_neg.cc:
	New test case.
	* testsuite/23_containers/unordered_map/debug/invalid_local_iterator_copy_assignment_neg.cc:
	New test case.
	* testsuite/23_containers/unordered_map/debug/invalid_local_iterator_copy_construction_neg.cc:
	New test case.
	* testsuite/23_containers/unordered_map/debug/invalid_local_iterator_move_assignment_neg.cc:
	New test case.
	* testsuite/23_containers/unordered_map/debug/invalid_local_iterator_move_construction_neg.cc:
	New test case.
	* testsuite/23_containers/unordered_map/debug/max_load_factor_neg.cc: Test unordered_map.
	* testsuite/23_containers/unordered_multimap/debug/begin2_neg.cc: Test unordered_multimap.
	* testsuite/23_containers/unordered_multimap/debug/bucket_size_neg.cc: Likewise.
	* testsuite/23_containers/unordered_multimap/debug/cbegin_neg.cc: Likewise.
	* testsuite/23_containers/unordered_multimap/debug/cend_neg.cc: Likewise.
	* testsuite/23_containers/unordered_multimap/debug/end1_neg.cc: Likewise.
	* testsuite/23_containers/unordered_multimap/debug/end2_neg.cc: Likewise.
	* testsuite/23_containers/unordered_multimap/debug/invalid_local_iterator_arrow_operator_neg.cc:
	New test case.
	* testsuite/23_containers/unordered_multimap/debug/invalid_local_iterator_const_conversion_neg.cc:
	New test case.
	* testsuite/23_containers/unordered_multimap/debug/invalid_local_iterator_copy_assignment_neg.cc:
	New test case.
	* testsuite/23_containers/unordered_multimap/debug/invalid_local_iterator_copy_construction_neg.cc:
	New test case.
	* testsuite/23_containers/unordered_multimap/debug/invalid_local_iterator_move_assignment_neg.cc:
	New test case.
	* testsuite/23_containers/unordered_multimap/debug/invalid_local_iterator_move_construction_neg.cc:
	New test case.
	* testsuite/23_containers/unordered_multimap/debug/max_load_factor_neg.cc:
	Test unordered_multimap.
	* testsuite/23_containers/unordered_multiset/debug/invalid_local_iterator_arrow_operator_neg.cc:
	New test case.
	* testsuite/23_containers/unordered_multiset/debug/invalid_local_iterator_const_conversion_neg.cc:
	New test case.
	* testsuite/23_containers/unordered_multiset/debug/invalid_local_iterator_copy_assignment_neg.cc:
	New test case.
	* testsuite/23_containers/unordered_multiset/debug/invalid_local_iterator_copy_construction_neg.cc:
	New test case.
	* testsuite/23_containers/unordered_multiset/debug/invalid_local_iterator_move_assignment_neg.cc:
	New test case.
	* testsuite/23_containers/unordered_multiset/debug/invalid_local_iterator_move_construction_neg.cc:
	New test case.
	* testsuite/23_containers/unordered_set/debug/invalid_local_iterator_arrow_operator_neg.cc:
	New test case.
	* testsuite/23_containers/unordered_set/debug/invalid_local_iterator_const_conversion_neg.cc:
	New test case.
	* testsuite/23_containers/unordered_set/debug/invalid_local_iterator_copy_assignment_neg.cc:
	New test case.
	* testsuite/23_containers/unordered_set/debug/invalid_local_iterator_copy_construction_neg.cc:
	New test case.
	* testsuite/23_containers/unordered_set/debug/invalid_local_iterator_move_assignment_neg.cc:
	New test case.
	* testsuite/23_containers/unordered_set/debug/invalid_local_iterator_move_construction_neg.cc:
	New test case.

Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
2025-04-18 21:26:46 +02:00
Tomasz Kamiński
473dde5252 libstdc++: Implement formatters for pair and tuple [PR109162]
This patch implements formatter specializations for pair and tuple form
P2286R8. In addition using 'm` and range_format::map (from P2585R1) for
ranges are now supported.

The formatters for pairs and tuples whose corresponding elements are the same
(after applying remove_cvref_t) derive from the same __tuple_formatter class.
This reduce the code duplication, as most of the parsing and formatting is the
same in such cases. We use a custom reduced implementation of the tuple
(__formatters_storage) to store the elements formatters.

Handling of the padding (width and fill) options, is extracted to
__format::__format_padded function, that is used both by __tuple_formatter and
range_formatter. To reduce number of instantations range_formatter::format
triggers, we cast incoming range to __format::__maybe_const_range<_Rg, _CharT>&,
before formatting it.

As in the case of previous commits, the signatures of the user-facing parse
and format methods of the provided formatters deviate from the standard by
constraining types of parameters:
* _CharT is constrained __formatter::__char
* basic_format_parse_context<_CharT> for parse argument
* basic_format_context<_Out, _CharT> for format second argument
The standard specifies last three of above as unconstrained types.

Finally, test for tuple-like std::array and std::ranges::subrange,
that illustrate that they remain formatted as ranges.

	PR libstdc++/109162

libstdc++-v3/ChangeLog:

	* include/std/format (__formatter_int::_M_format_character_escaped)
	(__formatter_str::format): Use __sink.out() to produce _Sink_iter.
	(__format::__const_formattable_range): Moved closer to range_formatter.
	(__format::__maybe_const_range): Use `__conditional_t` and moved closer
	to range_formatter.
	(__format::__format_padded, __format::maybe_const)
	(__format::__indexed_formatter_storage, __format::__tuple_formatter)
	(std::formatter<pair<_Fp, _Sp>, _CharT>>)
	(std::formatter<tuple<_Tps...>, _CharT): Define.
	(std::formatter<_Rg, _CharT>::format): Cast incoming range to
	__format::__maybe_const_range<_Rg, _CharT>&.
	(std::formatter<_Rg, _CharT>::_M_format): Extracted from format,
	and use __format_padded.
	(std::formatter<_Rg, _CharT>::_M_format_no_padding): Rename...
	(std::formatter<_Rg, _CharT>::_M_format_elems): ...to this.
	(std::formatter<_Rg, _CharT>::_M_format_with_padding): Extracted as
	__format_padded.
	* testsuite/util/testsuite_iterators.h (test_input_range_nocopy):
	Define.
	* testsuite/std/format/ranges/formatter.cc: Tests for `m` specifier.
	* testsuite/std/format/ranges/sequence.cc: Tests for array and subrange.
	* testsuite/std/format/ranges/map.cc: New test.
	* testsuite/std/format/tuple.cc: New test.

Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-04-16 12:20:56 +02:00
Jonathan Wakely
8a208899e9 libstdc++: Enable __gnu_test::test_container constructor for C++98
The only reason this constructor wasn't defined for C++98 is that it
uses constructor delegation, but that isn't necessary.

libstdc++-v3/ChangeLog:

	* testsuite/util/testsuite_iterators.h (test_container): Define
	array constructor for C++98 as well.
2025-04-15 09:24:44 +01:00
Jonathan Wakely
20828a8128 libstdc++: Add P1206R7 from_range members to container adaptors [PR111055]
This is another piece of P1206R7, adding new members to std::stack,
std::queue, and std::priority_queue.

	PR libstdc++/111055

libstdc++-v3/ChangeLog:

	* include/bits/stl_queue.h (queue(from_range_t, _Rg&&))
	(queue(from_range_t, _Rg&&, const _Alloc&), push_range):
	Define.
	(priority_queue(from_range_t, R&&, const Compare&))
	(push_range): Define.
	* include/bits/stl_stack.h (stack(from_range_t, R&&))
	(stack(from_range_t, R&&, const Alloc&), push_range): Define.
	* testsuite/util/testsuite_iterators.h (test_range_nocopy): Define.
	* testsuite/23_containers/priority_queue/cons_from_range.cc: New test.
	* testsuite/23_containers/priority_queue/members/push_range.cc: New test.
	* testsuite/23_containers/queue/cons_from_range.cc: New test.
	* testsuite/23_containers/queue/members/push_range.cc: New test.
	* testsuite/23_containers/stack/cons_from_range.cc: New test.
	* testsuite/23_containers/stack/members/push_range.cc: New test.

Co-authored-by: Tomasz Kamiński <tkaminsk@redhat.com>
Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-03-13 16:48:56 +01:00
Rainer Orth
6b49883e62 libstdc++: Fix gnu.ver CXXABI_1.3.16 for Solaris [PR118701]
This patch

commit c6977f7658
Author: Andreas Schwab <schwab@suse.de>
Date:   Tue Jan 21 23:50:15 2025 +0100

    libstdc++: correct symbol version of typeinfo for bfloat16_t on RISC-V

broke the libstdc++-abi/abi_check test on Solaris: the log shows

1 incompatible symbols
0
Argument "{CXXABI_1.3.15}" isn't numeric in numeric eq (==) at /vol/gcc/src/hg/master/local/libstdc++-v3/scripts/extract_symvers.pl line 129.
version status: incompatible
type: uncategorized
status: added

The problem has two parts:

* The patch above introduced a new version in libstdc++.so,
  CXXABI_1.3.16, which everywhere but on RISC-V contains no symbols (a
  weak version).  This is the first time this happened in libstdc++.

* Solaris uses scripts/extract_symvers.pl to determine the version info.
  The script currently chokes on the pvs output for weak versions:

  libstdc++.so.6.0.34 -	CXXABI_1.3.16 [WEAK]: {CXXABI_1.3.15};

  instead of

  libstdc++.so.6.0.34 -	CXXABI_1.3.16: {CXXABI_1.3.15};

While this patch hardens the script to cope with weak versions, there's
no reason to introduce them in the first place.  So the new version is
only created on __riscv.

Tested on i386-pc-solaris2.11, sparc-sun-solaris2.11, and
x86_64-pc-linux-gnu.

2025-01-29  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
	    Jonathan Wakely  <jwakely@redhat.com>

	libstdc++-v3:
	PR libstdc++/118701
	* config/abi/pre/gnu.ver (CXXABI_1.3.16): Move __riscv guard
	around version.
	* scripts/extract_symvers.pl: Allow for weak versions.
	* testsuite/util/testsuite_abi.cc (check_version): Wrap
	CXXABI_1.3.16 in __riscv.
2025-02-05 09:59:56 +01:00
Andreas Schwab
c6977f7658 libstdc++: correct symbol version of typeinfo for bfloat16_t on RISC-V
RISC-V only gained support for bfloat16_t after gcc 14.  Passes
libstdc++/check_abi on {x86_64,aarch64,ppc64le,riscv64,s390x}-suse-linux.

	PR libstdc++/118563
	* testsuite/util/testsuite_abi.cc (check_version): Add
	CXXABI_1.3.16.
	* config/abi/pre/gnu.ver (CXXABI_1.3.14) [__riscv]: Exclude
	typeinfo for bfloat16_t.
	(CXXABI_1.3.16) [__riscv]: Add it here.
2025-01-27 14:15:53 +01:00
Jakub Jelinek
6441eb6dc0 Update copyright years. 2025-01-02 11:59:57 +01:00
Jonathan Wakely
bb551f497e libstdc++: Deprecate std::rel_ops namespace for C++20
This is deprecated in the C++20 standard and will be removed at some
point.

libstdc++-v3/ChangeLog:

	* include/bits/stl_relops.h (rel_ops): Add deprecated attribute.
	* testsuite/20_util/headers/utility/using_namespace_std_rel_ops.cc:
	Add dg-warning for -Wdeprecated warnings.
	* testsuite/20_util/rel_ops.cc: Likewise.
	* testsuite/util/testsuite_containers.h: Disable -Wdeprecated
	warnings when using rel_ops.
2024-11-28 15:27:28 +00:00
Jonathan Wakely
19d0720f68 libstdc++: Fix calculation of system time in performance tests
The system_time() function used the wrong element of the splits array.

Also add a comment about the units for time measurements.

libstdc++-v3/ChangeLog:

	* testsuite/util/testsuite_performance.h (time_counter): Add
	comment about times.
	(time_counter::system_time): Use correct split value.
2024-11-13 20:21:38 +00:00
Jonathan Wakely
2b92007016 libstdc++: Use __is_single_threaded() in performance tests
With recent glibc releases the __gthread_active_p() function is always
true, so we always append "-thread" onto performance benchmark names.

Use the __gnu_cxx::__is_single_threaded() function instead.

libstdc++-v3/ChangeLog:

	* testsuite/util/testsuite_performance.h: Use
	__gnu_cxx::__is_single_threaded instead of __gthread_active_p().
2024-11-13 17:58:50 +00:00
Jonathan Wakely
8586e16154 libstdc++: Stop using std::unary_function in perf tests
This fixes some -Wdeprecated-declarations warnings.

libstdc++-v3/ChangeLog:

	* testsuite/performance/ext/pb_ds/hash_int_erase_mem.cc: Replace
	std::unary_function with result_type and argument_type typedefs.
	* testsuite/util/performance/assoc/multimap_common_type.hpp:
	Likewise.
2024-11-13 17:58:50 +00:00
Jonathan Wakely
b281e13eca libstdc++: Add P1206R7 from_range members to std::vector [PR111055]
This is another piece of P1206R7, adding new members to std::vector and
std::vector<bool>.

The __uninitialized_copy_a extension needs to be enhanced to support
passing non-common ranges (i.e. a sentinel that is a different type from
the iterator) and move-only input iterators.

libstdc++-v3/ChangeLog:

	PR libstdc++/111055
	* include/bits/ranges_base.h (__container_compatible_range): New
	concept.
	* include/bits/stl_bvector.h (vector(from_range, R&&, const Alloc&))
	(assign_range, insert_range, append_range): Define.
	* include/bits/stl_uninitialized.h (__do_uninit_copy): Support
	non-common ranges.
	(__uninitialized_copy_a): Likewise.
	* include/bits/stl_vector.h (_Vector_base::_M_append_range_to):
	New function.
	(_Vector_base::_M_append_range): Likewise.
	(vector(from_range, R&&, const Alloc&), assign_range): Define.
	(append_range): Define.
	(insert_range): Declare.
	* include/debug/vector (vector(from_range, R&&, const Alloc&))
	(assign_range, insert_range, append_range): Define.
	* include/bits/vector.tcc (insert_range): Define.
	* testsuite/util/testsuite_iterators.h (input_iterator_wrapper_rval):
	New class template.
	* testsuite/23_containers/vector/bool/cons/from_range.cc: New test.
	* testsuite/23_containers/vector/bool/modifiers/assign/assign_range.cc:
	New test.
	* testsuite/23_containers/vector/bool/modifiers/insert/append_range.cc:
	New test.
	* testsuite/23_containers/vector/bool/modifiers/insert/insert_range.cc:
	New test.
	* testsuite/23_containers/vector/cons/from_range.cc: New test.
	* testsuite/23_containers/vector/modifiers/append_range.cc: New test.
	* testsuite/23_containers/vector/modifiers/assign/assign_range.cc:
	New test.
	* testsuite/23_containers/vector/modifiers/insert/insert_range.cc:
	New test.

Reviewed-by: Patrick Palka <ppalka@redhat.com>
2024-10-27 20:09:31 +00:00
Jonathan Wakely
74b5101cc9 libstdc++: Handle encodings in localized chrono formatting [PR109162]
This implements the C++23 paper P2419R2 (Clarify handling of encodings
in localized formatting of chrono types). The requirement is that when
the literal encoding is "a Unicode encoding form" and the formatting
locale uses a different encoding, any locale-specific strings such as
"août" for std::chrono::August should be converted to the literal
encoding.

Using the recently-added std::locale::encoding() function we can check
the locale's encoding and then use iconv if a conversion is needed.
Because nl_langinfo_l and iconv_open both allocate memory, a naive
implementation would perform multiple allocations and deallocations for
every snippet of locale-specific text that needs to be converted to
UTF-8. To avoid that, a new internal locale::facet is defined to store
the text_encoding and an iconv_t descriptor, which are then cached in
the formatting locale. This requires access to the internals of a
std::locale object in src/c++20/format.cc, so that new file needs to be
compiled with -fno-access-control, as well as -std=gnu++26 in order to
use std::text_encoding.

Because the new std::text_encoding and std::locale::encoding() symbols
are only in the libstdc++exp.a archive, we need to include
src/c++26/text_encoding.cc in the main library, but not export its
symbols yet. This means they can be used by the two new functions which
are exported from the main library.

The encoding conversions are done for C++20, treating it as a DR that
resolves LWG 3656.

With this change we can increase the value of the __cpp_lib_format macro
for C++23. The value should be 202207 for P2419R2, but we already
implement P2510R3 (Formatting pointers) so can use the value 202304.

libstdc++-v3/ChangeLog:

	PR libstdc++/109162
	* acinclude.m4 (libtool_VERSION): Update to 6:34:0.
	* config/abi/pre/gnu.ver: Disambiguate old patters. Add new
	GLIBCXX_3.4.34 symbol version and new exports.
	* configure: Regenerate.
	* include/bits/chrono_io.h (_ChronoSpec::_M_locale_specific):
	Add new accessor functions to use a reserved bit in _Spec.
	(__formatter_chrono::_M_parse): Use _M_locale_specific(true)
	when chrono-specs contains locale-dependent conversion
	specifiers.
	(__formatter_chrono::_M_format): Open iconv descriptor if
	conversion to UTF-8 will be needed.
	(__formatter_chrono::_M_write): New function to write a
	localized string with possible character conversion.
	(__formatter_chrono::_M_a_A, __formatter_chrono::_M_b_B)
	(__formatter_chrono::_M_p, __formatter_chrono::_M_r)
	(__formatter_chrono::_M_x, __formatter_chrono::_M_X)
	(__formatter_chrono::_M_locale_fmt): Use _M_write.
	* include/bits/version.def (format): Update value.
	* include/bits/version.h: Regenerate.
	* include/std/format (_GLIBCXX_P2518R3): Check feature test
	macro instead of __cplusplus.
	(basic_format_context): Declare __formatter_chrono as friend.
	* src/c++20/Makefile.am: Add new file.
	* src/c++20/Makefile.in: Regenerate.
	* src/c++20/format.cc: New file.
	* testsuite/std/time/format_localized.cc: New test.
	* testsuite/util/testsuite_abi.cc: Add new symbol version.
2024-07-31 17:07:10 +01:00
Jonathan Wakely
cda469a59e libstdc++: ranges::find needs explicit conversion to size_t [PR115799]
For an integer-class type we need to use an explicit conversion to size_t.

libstdc++-v3/ChangeLog:

	PR libstdc++/115799
	* include/bits/ranges_util.h (__find_fn): Make conversion
	from difference type ti size_t explicit.
	* testsuite/25_algorithms/find/bytes.cc: Check ranges::find with
	__gnu_test::test_contiguous_range.
	* testsuite/std/ranges/range.cc: Adjust expected difference_type
	for __gnu_test::test_contiguous_range.
	* testsuite/util/testsuite_iterators.h (contiguous_iterator_wrapper):
	Use __max_diff_type as difference type.
	(test_range::sentinel, test_sized_range_sized_sent::sentinel):
	Ensure that operator- returns difference_type.
2024-07-10 22:05:21 +01:00
Jonathan Wakely
e2fb245b07 libstdc++: Initialize base in test allocator's constructor
This fixes a warning from one of the test allocators:
warning: base class 'class std::allocator<__gnu_test::copy_tracker>' should be explicitly initialized in the copy constructor [-Wextra]

libstdc++-v3/ChangeLog:

	* testsuite/util/testsuite_allocator.h (tracker_allocator):
	Initialize base class in copy constructor.
2024-06-21 10:10:09 +01:00
Jonathan Wakely
6e25ca387f libstdc++: Update ABI test to disallow adding to released symbol versions
If we update the list of "active" symbols versions now, rather than when
adding a new symbol version, we will notice if new symbols get added to
the wrong version (as in PR 114692).

libstdc++-v3/ChangeLog:

	* testsuite/util/testsuite_abi.cc: Update latest versions to
	new versions that should be used in future.
2024-05-07 13:46:11 +01:00
Jonathan Wakely
1defe743ae libstdc++: Export std::__basic_file::native_handle as GLIBCXX_3.4.33 [PR114692]
I added this new symbol in the wrong version. GLIBCXX_3.4.32 was
already used for the GCC 13.2.0 release, so the new symbol should have
been in a new GLIBCXX_3.4.33 version.

Additionally, the pattern doesn't need to use [cw] because we only ever
use __basic_file<char>, even for std::basic_filebuf<wchar_t>.

libstdc++-v3/ChangeLog:

	PR libstdc++/114692
	* config/abi/pre/gnu.ver (GLIBCXX_3.4.32): Move new exports for
	__basic_file::native_handle to ...
	(GLIBCXX_3.4.33): ... here. Adjust to not match wchar_t
	specialization, which isn't used.
	* testsuite/util/testsuite_abi.cc: Add GLIBCXX_3.4.33 and update
	latest version check.
2024-04-11 15:22:33 +01:00
Jonathan Wakely
f5118546a8 libstdc++: Fix typos in MemoryChecker assertion messages in PSTL tests
This has been reported upstream.

libstdc++-v3/ChangeLog:

	* testsuite/util/pstl/test_utils.h: Fix typos in comments.
2024-03-19 15:20:07 +00:00
Jonathan Wakely
709d8474bc libstdc++: Replace unnecessary uses of built-ins in testsuite
I don't see why we should rely on __builtin_memset etc. in tests. We can
just include <cstring> and use the public API.

libstdc++-v3/ChangeLog:

	* testsuite/23_containers/deque/allocator/default_init.cc: Use
	std::memset instead of __builtin_memset.
	* testsuite/23_containers/forward_list/allocator/default_init.cc:
	Likewise.
	* testsuite/23_containers/list/allocator/default_init.cc:
	Likewise.
	* testsuite/23_containers/map/allocator/default_init.cc:
	Likewise.
	* testsuite/23_containers/set/allocator/default_init.cc:
	Likewise.
	* testsuite/23_containers/unordered_map/allocator/default_init.cc:
	Likewise.
	* testsuite/23_containers/unordered_set/allocator/default_init.cc:
	Likewise.
	* testsuite/23_containers/vector/allocator/default_init.cc:
	Likewise.
	* testsuite/23_containers/vector/bool/allocator/default_init.cc:
	Likewise.
	* testsuite/29_atomics/atomic/compare_exchange_padding.cc:
	Likewise.
	* testsuite/util/atomic/wait_notify_util.h: Likewise.
2024-03-07 20:55:25 +00:00
Jonathan Wakely
723a7c1ad2 libstdc++: Avoid reusing moved-from iterators in PSTL tests [PR90276]
The reverse_invoker utility for PSTL tests uses forwarding references for
all parameters, but some of those parameters get forwarded to move
constructors which then leave the objects in a moved-from state. When
the parameters are forwarded a second time that results in making new
copies of moved-from iterators.  For libstdc++ debug mode iterators, the
moved-from state is singular, which means copying them will abort at
runtime.

The fix is to make copies of iterator arguments instead of forwarding
them.

The callers of reverse_invoker::operator() also forward the iterators
multiple times, but that's OK because reverse_invoker accepts them by
forwarding reference but then breaks the chain of forwarding and copies
them as lvalues.

libstdc++-v3/ChangeLog:

	PR libstdc++/90276
	* testsuite/util/pstl/test_utils.h (reverse_invoker): Do not use
	perfect forwarding for iterator arguments.
2024-02-02 10:27:16 +00:00
Jakub Jelinek
a945c346f5 Update copyright years. 2024-01-03 12:19:35 +01:00
Jonathan Wakely
0585daf7de libstdc++: Fix access error in __gnu_test::uneq_allocator
The operator== function is only a friend of the LHS argument, so cannot
access the private member of the RHS argument. Use the public accessor
instead.

libstdc++-v3/ChangeLog:

	* testsuite/util/testsuite_allocator.h (uneq_allocator): Fix
	equality operator for heterogeneous comparisons.
2023-11-23 17:44:26 +00:00
Jonathan Wakely
833733702a libstdc++: Avoid -Wunused-parameter warning in testsuite helper
libstdc++-v3/ChangeLog:

	* testsuite/util/testsuite_iterators.h (is_customization_point_object):
	Remove parameter name.
2023-09-07 08:02:49 +01:00
François Dumont
2aa8ebc0a6 libstdc++: Fix tests relying on operator new/delete overload
Fix tests that are checking for an expected allocation plan. They are failing if
an allocation is taking place outside the test main.

libstdc++-v3/ChangeLog

	* testsuite/util/replacement_memory_operators.h
	(counter::scope): New, capture and reset counter count at construction and
	restore it at destruction.
	(counter::check_new): Add scope instantiation.
	* testsuite/23_containers/unordered_map/96088.cc (main):
	Add counter::scope instantiation.
	* testsuite/23_containers/unordered_multimap/96088.cc (main): Likewise.
	* testsuite/23_containers/unordered_multiset/96088.cc (main): Likewise.
	* testsuite/23_containers/unordered_set/96088.cc (main): Likewise.
	* testsuite/ext/malloc_allocator/deallocate_local.cc (main): Likewise.
	* testsuite/ext/new_allocator/deallocate_local.cc (main): Likewise.
	* testsuite/ext/throw_allocator/deallocate_local.cc (main): Likewise.
	* testsuite/ext/pool_allocator/allocate_chunk.cc (started): New global.
	(operator new(size_t)): Check started.
	(main): Set/Unset started.
	* testsuite/17_intro/no_library_allocation.cc: New test case.
2023-08-23 06:35:24 +02:00
Thomas Rodgers
3162ca09db libstdc++: Synchronize PSTL with upstream
This patch rebases the C++17 parallel algorithms implementation (pstl)
against the current upstream version, commit 843c12d6a.

This version does not currently include the recently added OpenMP
backend, that will be considered for a future version.

libstdc++-v3/ChangeLog:
	* include/pstl/algorithm_fwd.h: Synchronize with upstream.
	* include/pstl/algorithm_impl.h: Likewise.
	* include/pstl/execution_defs.h: Likewise.
	* include/pstl/execution_impl.h: Likewise.
	* include/pstl/glue_algorithm_impl.h: Likewise.
	* include/pstl/glue_execution_defs.h: Likewise.
	* include/pstl/glue_memory_impl.h: Likewise.
	* include/pstl/glue_numeric_impl.h: Likewise.
	* include/pstl/memory_impl.h: Likewise.
	* include/pstl/numeric_fwd.h: Likewise.
	* include/pstl/numeric_impl.h: Likewise.
	* include/pstl/parallel_backend.h: Likewise.
	* include/pstl/parallel_backend_serial.h: Likewise.
	* include/pstl/parallel_backend_tbb.h: Likewise.
	* include/pstl/parallel_impl.h: Likewise.
	* include/pstl/pstl_config.h: Likewise.
	* include/pstl/unseq_backend_simd.h: Likewise.
	* include/pstl/utils.h: Likewise.
	* testsuite/20_util/specialized_algorithms/pstl/uninitialized_construct.cc:
	Likewise.
	* testsuite/20_util/specialized_algorithms/pstl/uninitialized_copy_move.cc:
	Likewise.
	* testsuite/20_util/specialized_algorithms/pstl/uninitialized_fill_destroy.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_merge/inplace_merge.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_merge/merge.cc: Likewise.
	* testsuite/25_algorithms/pstl/alg_modifying_operations/copy_if.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_modifying_operations/copy_move.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_modifying_operations/fill.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_modifying_operations/generate.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_modifying_operations/is_partitioned.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_modifying_operations/partition.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_modifying_operations/partition_copy.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_modifying_operations/remove.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_modifying_operations/remove_copy.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_modifying_operations/replace.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_modifying_operations/replace_copy.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_modifying_operations/rotate.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_modifying_operations/rotate_copy.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_modifying_operations/swap_ranges.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_modifying_operations/transform_binary.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_modifying_operations/transform_unary.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_modifying_operations/unique.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_modifying_operations/unique_copy_equal.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_nonmodifying/adjacent_find.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_nonmodifying/all_of.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_nonmodifying/any_of.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_nonmodifying/count.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_nonmodifying/equal.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_nonmodifying/find.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_nonmodifying/find_end.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_nonmodifying/find_first_of.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_nonmodifying/find_if.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_nonmodifying/for_each.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_nonmodifying/mismatch.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_nonmodifying/none_of.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_nonmodifying/nth_element.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_nonmodifying/reverse.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_nonmodifying/reverse_copy.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_nonmodifying/search_n.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_sorting/includes.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_sorting/is_heap.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_sorting/is_sorted.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_sorting/lexicographical_compare.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_sorting/minmax_element.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_sorting/partial_sort.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_sorting/partial_sort_copy.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_sorting/set.cc:
	Likewise.
	* testsuite/25_algorithms/pstl/alg_sorting/sort.cc:
	Likewise.
	* testsuite/26_numerics/pstl/numeric_ops/adjacent_difference.cc:
	Likewise.
	* testsuite/26_numerics/pstl/numeric_ops/reduce.cc:
	Likewise.
	* testsuite/26_numerics/pstl/numeric_ops/scan.cc:
	Likewise.
	* testsuite/26_numerics/pstl/numeric_ops/transform_reduce.cc:
	Likewise.
	* testsuite/26_numerics/pstl/numeric_ops/transform_scan.cc:
	Likewise.
	* testsuite/util/pstl/test_utils.h:
	Likewise.
2023-06-26 11:34:43 -07:00
Jonathan Wakely
b6235dbcfc libstdc++: Restore accidentally removed version in abi-check
In r14-1583-g192665feef7129 I meant to add CXXABI_1.3.15 but instead I
replaced CXXABI_1.3.14 with it. This restores the CXXABI_1.3.14 version.

libstdc++-v3/ChangeLog:

	* testsuite/util/testsuite_abi.cc (check_version): Re-add
	CXXABI_1.3.14.
2023-06-07 16:51:59 +01:00
Jonathan Wakely
192665feef libstdc++: Update list of known symbol versions for abi-check
Add the recently added CXXABI_1.3.15 version. Also remove two "frozen"
versions from the latestp list, as no more symbols should be added to
those now.

libstdc++-v3/ChangeLog:

	* testsuite/util/testsuite_abi.cc (check_version): Add
	CXXABI_1.3.15 symver and make it the latestp. Remove
	GLIBCXX_IEEE128_3.4.31 and GLIBCXX_LDBL_3.4.31 from latestp.
2023-06-06 16:29:22 +01:00
Jonathan Wakely
1f378f6dd3 libstdc++: Stop using _GLIBCXX_USE_C99_MATH_TR1 in <cmath>
Similar to the three commits r14-908, r14-909 and r14-910, the
_GLIBCXX_USE_C99_MATH_TR1 macro is misleading when it is also used for
<cmath>, not only for <tr1/cmath> headers. It is also wrong, because the
configure checks for TR1 use -std=c++98 and a target might define the
C99 features for C++11 but not for C++98.

Add separate configure checks for the <math.h> functions using
-std=c++11 for the checks. Use the new macro defined by those checks in
the C++11-specific parts of <cmath>, and in <complex>, <random> etc.

The check that defines _GLIBCXX_NO_C99_ROUNDING_FUNCS is only needed for
the C++11 <cmath> checks, so remove that from GLIBCXX_CHECK_C99_TR1 and
only do it for GLIBCXX_ENABLE_C99.

libstdc++-v3/ChangeLog:

	* acinclude.m4 (GLIBCXX_ENABLE_C99): Add checks for C99 math
	functions and define _GLIBCXX_USE_C99_MATH_FUNCS. Move checks
	for C99 rounding functions to here.
	(GLIBCXX_CHECK_C99_TR1): Remove checks for C99 rounding
	functions from here.
	* config.h.in: Regenerate.
	* configure: Regenerate.
	* include/bits/random.h: Use _GLIBCXX_USE_C99_MATH_FUNCS instead
	of _GLIBCXX_USE_C99_MATH_TR1.
	* include/bits/random.tcc: Likewise.
	* include/c_compatibility/math.h: Likewise.
	* include/c_global/cmath: Likewise.
	* include/ext/random: Likewise.
	* include/ext/random.tcc: Likewise.
	* include/std/complex: Likewise.
	* testsuite/20_util/from_chars/4.cc: Likewise.
	* testsuite/20_util/from_chars/8.cc: Likewise.
	* testsuite/26_numerics/complex/proj.cc: Likewise.
	* testsuite/26_numerics/headers/cmath/60401.cc: Likewise.
	* testsuite/26_numerics/headers/cmath/types_std_c++0x.cc:
	Likewise.
	* testsuite/lib/libstdc++.exp (check_v3_target_cstdint):
	Likewise.
	* testsuite/util/testsuite_random.h: Likewise.
2023-05-31 21:01:16 +01:00
Jonathan Wakely
8d2fa90a41 libstdc++: Add relational operators to __gnu_test::PointerBase
The Cpp17Allocator requirements say that an allocator's pointer and
const_pointer types must meet the Cpp17RandomAccessIterator
requirements. That means our PointerBase helper for defining fancy
pointer types should support the full set of relational operators.

libstdc++-v3/ChangeLog:

	* testsuite/util/testsuite_allocator.h (PointerBase): Add
	relational operators.
2023-05-26 00:14:43 +01:00