gcc/libstdc++-v3/testsuite
Jonathan Wakely ff7793bea4 libstdc++: Allow stateful allocators in std::list::sort [PR 66742]
The temporary lists used by std::list::sort are default constructed,
which means they use default constructed allocators. The sort operation
is defined in terms of merge and splice operations, which have undefined
behaviour (and abort) if the allocators do not compare equal. This means
it is not possible to sort a list that uses an allocator that compares
unequal to an default constructed allocator.

The solution is to avoid using temporary std::list objects at all. We do
not need to be able to allocate memory because no nodes are allocated,
only spliced from one list to another. That means the temporary lists
don't need an allocator at all, so whether it would compare equal
doesn't matter.

Instead of temporary std::list objects, we can just use a collection of
_List_node_base objects that nodes can be spliced onto as needed. Those
objects are wrapped in a _Scratch_list type that implements the splicing
and merging operations used by list::sort.

We also don't need to update the list size during the sort, because
sorting doesn't alter the number of nodes. Although we move nodes in and
out of the scratch lists, at the end of the function all nodes are back
in the original std::list and the scratch lists are empty.  So for the
cxx11 ABI we can avoid the _M_size modifications usually done when
splicing nodes.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>

libstdc++-v3/ChangeLog:

	PR libstdc++/66742
	* include/bits/list.tcc (list::sort()): Use _Scratch_list
	objects for splicing and merging.
	(list::sort(StrictWeakOrdering)): Likewise.
	* include/bits/stl_list.h (__detail::_Scratch_list): New type.
	* src/c++98/list.cc (_List_node_base::_M_transfer): Add
	assertion for --enable-libstdcxx-debug library.
	* testsuite/23_containers/list/operations/66742.cc: New test.
2021-10-01 20:36:56 +01:00
..
17_intro libstdc++: Fix 17_intro/names.cc failures on Solaris 2021-08-31 14:17:53 +01:00
18_support libstdc++: Add [[nodiscard]] to <compare> 2021-08-05 15:16:58 +01:00
19_diagnostics libstdc++: Avoid unconditional use of errc::not_supported [PR 99327] 2021-10-01 20:34:50 +01:00
20_util libstdc++: Allow visiting inherited variants [PR 90943] 2021-10-01 20:34:48 +01:00
21_strings libstdc++: Add [[nodiscard]] to iterators and related utilities 2021-08-04 12:54:28 +01:00
22_locale libstdc++: Fix new test for C++98 mode [PR 89728] 2021-06-01 19:02:42 +01:00
23_containers libstdc++: Allow stateful allocators in std::list::sort [PR 66742] 2021-10-01 20:36:56 +01:00
24_iterators libstdc++: Implement LWG 3392 for std::ranges::distance 2021-10-01 20:36:54 +01:00
25_algorithms libstdc++: Add missing header to test 2021-10-01 15:04:02 +01:00
26_numerics libstdc++: Rename tests with incorrect extension 2021-09-17 12:40:41 +01:00
27_io libstdc++: Rename tests with incorrect extension 2021-09-17 12:40:41 +01:00
28_regex libstdc++: Implement std::regex_constants::multiline (LWG 2503) 2021-09-29 13:48:19 +01:00
29_atomics libstdc++: Fix UB in atomic_ref/wait_notify.cc [PR101761] 2021-09-16 14:48:17 -07:00
30_threads libstdc++: Make std::jthread support pointers to member functions [PR 100612] 2021-10-01 20:36:55 +01:00
abi Update copyright years. 2021-01-04 10:26:59 +01:00
backward Update copyright years. 2021-01-04 10:26:59 +01:00
config Update copyright years. 2021-01-04 10:26:59 +01:00
data
decimal Update copyright years. 2021-01-04 10:26:59 +01:00
experimental libstdc++: Use "test.invalid." for invalid hostname 2021-09-10 15:10:21 +01:00
ext libstdc++: Remove useless base classes in pb_db tests 2021-10-01 20:36:54 +01:00
lib libstdc++: Avoid illegal argument to verbose in dg-test callback, continued 2021-08-17 21:05:27 +02:00
libstdc++-abi Update copyright years. 2021-01-04 10:26:59 +01:00
libstdc++-dg libstdc++: Add std::experimental::simd from the Parallelism TS 2 2021-01-27 16:37:26 +00:00
libstdc++-prettyprinters libstdc++: Fix vector<bool> printer tests to work in debug mode 2021-08-18 14:26:38 +01:00
libstdc++-xmethods Update copyright years. 2021-01-04 10:26:59 +01:00
performance Update copyright years. 2021-01-04 10:26:59 +01:00
special_functions Update copyright years. 2021-01-04 10:26:59 +01:00
std libstdc++: Add default template argument to basic_istream_view 2021-08-23 16:17:10 +01:00
tr1 libstdc++: Fix some tests that fail in C++20 mode 2021-04-12 12:30:07 +01:00
tr2 Update copyright years. 2021-01-04 10:26:59 +01:00
util libstdc++: Fix last std::tuple constructor missing 'constexpr' [PR102270] 2021-09-17 20:43:34 +01:00
Makefile.am libstdc++: Remove -fno-tree-vrp after PR98834 was resolved 2021-06-23 18:28:59 +01:00
Makefile.in libstdc++: Remove -fno-tree-vrp after PR98834 was resolved 2021-06-23 18:28:59 +01:00