Files
gcc/libstdc++-v3/testsuite/util
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
..
2025-05-22 12:13:55 +01:00