gcc/libstdc++-v3/testsuite
Jonathan Wakely caf80d87b5 PR libstdc++/87431 fix regression introduced by r264574
The previous patch for PR 87431 assumed that initialing a scalar type
could not throw, but it can obtain its value via a conversion operator,
which could throw. This meant the variant could get into a valueless
state, but the valueless_by_exception() member function would always
return false.

This patch fixes it by changing the emplace members to have strong
exception safety when initializing a contained value of trivially
copyable type. The _M_valid() member gets a corresponding change to
always return true for trivially copyable types, not just scalar types.

Strong exception safety (i.e. never becoming valueless) is achieved by
only replacing the current contained value once any potentially throwing
operations have completed. If constructing the new contained value can
throw then a new std::variant object is constructed to hold it, and then
move-assigned to *this (which won't throw).

	PR libstdc++/87431
	* include/std/variant (_Variant_storage<true, _Types...>::_M_valid):
	Check is_trivially_copyable instead of is_scalar.
	(variant::emplace<N, Args>(Args&&...)): If construction of the new
	contained value can throw and its type is trivially copyable then
	construct into a temporary variant and move from it, to provide the
	strong exception safety guarantee.
	(variant::emplace<N, U, Args>(initializer_list<U>, Args&&...)):
	Likewise.
	* testsuite/20_util/variant/87431.cc: New test.
	* testsuite/20_util/variant/run.cc: Adjust test so that throwing
	conversion causes valueless state.

From-SVN: r267614
2019-01-06 20:52:34 +00:00
..
17_intro PR libstdc++/88607 add tests using -finput-charset=ascii 2019-01-06 00:49:11 +00:00
18_support Update copyright years. 2019-01-01 13:31:55 +01:00
19_diagnostics Update copyright years. 2019-01-01 13:31:55 +01:00
20_util PR libstdc++/87431 fix regression introduced by r264574 2019-01-06 20:52:34 +00:00
21_strings Add allocator-extended copy/move ctors to COW string 2019-01-04 23:23:17 +00:00
22_locale PR libstdc++/88681 export missing symbols 2019-01-03 20:38:04 +00:00
23_containers Fix test failure when -fno-inline is used 2019-01-04 18:56:26 +00:00
24_iterators Update copyright years. 2019-01-01 13:31:55 +01:00
25_algorithms Update copyright years. 2019-01-01 13:31:55 +01:00
26_numerics Update copyright years. 2019-01-01 13:31:55 +01:00
27_io Fix test failure with old Copy-On-Write std::string 2019-01-04 15:42:33 +00:00
28_regex Update copyright years. 2019-01-01 13:31:55 +01:00
29_atomics Update copyright years. 2019-01-01 13:31:55 +01:00
30_threads Update copyright years. 2019-01-01 13:31:55 +01:00
abi Update copyright years. 2019-01-01 13:31:55 +01:00
backward Update copyright years. 2019-01-01 13:31:55 +01:00
config Update copyright years. 2019-01-01 13:31:55 +01:00
data
decimal Update copyright years. 2019-01-01 13:31:55 +01:00
experimental Fix year range in copyright header 2019-01-02 10:44:35 +00:00
ext Update copyright years. 2019-01-01 13:31:55 +01:00
lib Update copyright years. 2019-01-01 13:31:55 +01:00
libstdc++-abi Update copyright years. 2019-01-01 13:31:55 +01:00
libstdc++-dg Update copyright years. 2019-01-01 13:31:55 +01:00
libstdc++-prettyprinters Update copyright years. 2019-01-01 13:31:55 +01:00
libstdc++-xmethods Update copyright years. 2019-01-01 13:31:55 +01:00
performance Update copyright years. 2019-01-01 13:31:55 +01:00
special_functions Update copyright years. 2019-01-01 13:31:55 +01:00
tr1 Update copyright years. 2019-01-01 13:31:55 +01:00
tr2 Update copyright years. 2019-01-01 13:31:55 +01:00
util Update copyright years. 2019-01-01 13:31:55 +01:00
Makefile.am Update copyright years. 2019-01-01 13:31:55 +01:00
Makefile.in Update GCC to autoconf 2.69, automake 1.15.1 (PR bootstrap/82856). 2018-10-31 17:03:16 +00:00