gcc/libstdc++-v3/testsuite
Jonathan Wakely 71e093897c PR libstdc++/87749 fix (and optimize) string move construction
The move constructor for the SSO string uses assign(const basic_string&)
when either:

(1) the source string is "local" and so the contents of the small string
buffer need to be copied, or

(2) the allocator does not propagate and is_always_equal is false.

Case (1) is suboptimal, because the assign member is not noexcept and
the compiler isn't smart enough to see it won't actually throw in this
case. This causes extra code in the move assignment operator so that any
exception will be turned into a call to std::terminate. This can be
fixed by copying small strings inline instead of calling assign.

Case (2) is a bug, because the specific instances of the allocators
could be equal even if is_always_equal is false. This can result in an
unnecessary deep copy (and potentially-throwing allocation) when the
storage should be moved. This can be fixed by simply checking if the
allocators are equal.

	PR libstdc++/87749
	* include/bits/basic_string.h [_GLIBCXX_USE_CXX11_ABI]
	(basic_string::operator=(basic_string&&)): For short strings copy the
	buffer inline. Only fall back to using assign(const basic_string&) to
	do a deep copy when reallocation is needed.
	* testsuite/21_strings/basic_string/modifiers/assign/char/87749.cc:
	New test.
	* testsuite/21_strings/basic_string/modifiers/assign/char/
	move_assign_optim.cc: New test.
	* testsuite/21_strings/basic_string/modifiers/assign/wchar_t/87749.cc:
	New test.
	* testsuite/21_strings/basic_string/modifiers/assign/wchar_t/
	move_assign_optim.cc: New test.

From-SVN: r265493
2018-10-25 16:34:04 +01:00
..
17_intro Add <bit> and <version> to freestanding headers 2018-08-13 19:54:34 +01:00
18_support * testsuite/18_support/new_nothrow.cc: XFAIL on AIX. 2018-08-21 10:03:16 -04:00
19_diagnostics Add workaround for non-unique errno values on AIX 2018-08-03 13:53:34 +01:00
20_util PR libstdc++/87704 fix unique_ptr(nullptr_t) constructors 2018-10-23 14:10:26 +01:00
21_strings PR libstdc++/87749 fix (and optimize) string move construction 2018-10-25 16:34:04 +01:00
22_locale Adjust test to pass with latest glibc 2018-10-15 14:55:42 +01:00
23_containers Relocation (= move+destroy) 2018-10-25 13:03:13 +00:00
24_iterators PR libstdc++/86734 make reverse_iterator::operator-> more robust 2018-07-30 18:13:05 +01:00
25_algorithms 10.cc: Add dg-require-fileio. 2018-08-31 15:09:47 -04:00
26_numerics PR libstdc++/87641 correctly initialize accumulator in valarray::sum() 2018-10-18 16:38:50 +01:00
27_io PR libstdc++/87618 fix typos in linker script 2018-10-16 12:14:37 +01:00
28_regex Fix compilation error with _GLIBCXX_PARALLEL 2018-10-19 14:46:24 +01:00
29_atomics Add missing dg-require-cstdint directives to tests 2018-07-26 15:03:28 +01:00
30_threads PR libstdc++/80538 Only call sleep for non-zero values 2018-10-11 17:37:23 +01:00
abi Update copyright years. 2018-01-03 11:03:58 +01:00
backward Remove duplicate function call in test 2018-05-02 17:27:01 +01:00
config Update copyright years. 2018-01-03 11:03:58 +01:00
data
decimal Update copyright years. 2018-01-03 11:03:58 +01:00
experimental Rename namespace alias in test to avoid name collision 2018-10-16 17:13:00 +01:00
ext Fix tests that use allocators with incorrect value types 2018-10-19 22:49:40 +01:00
lib Introduce dg-add-options net_ts 2018-10-16 12:27:52 +00:00
libstdc++-abi Update copyright years. 2018-01-03 11:03:58 +01:00
libstdc++-dg Update copyright years. 2018-01-03 11:03:58 +01:00
libstdc++-prettyprinters printers.py (NodeIteratorPrinter): New. 2018-03-08 06:26:15 +00:00
libstdc++-xmethods Update copyright years. 2018-01-03 11:03:58 +01:00
performance Update copyright years. 2018-01-03 11:03:58 +01:00
special_functions PR libstdc++/83140 - assoc_legendre returns negated value when m is odd 2018-05-10 13:59:52 +00:00
tr1 Add missing dg-require-cstdint directives to tests 2018-07-26 15:03:28 +01:00
tr2 Update copyright years. 2018-01-03 11:03:58 +01:00
util testsuite_containers.h (forward_members_unordered<>::forward_members_unordered (const value_type&)): Add local_iterator pre and post increment checks. 2018-10-20 20:00:45 +00:00
Makefile.am Update copyright years. 2018-01-03 11:03:58 +01:00
Makefile.in PR libstdc++/86450 use -Wabi=2 and simplify -Werror use 2018-07-17 14:18:47 +01:00