gcc/libstdc++-v3/testsuite/20_util
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
..
add_const Update copyright years. 2019-01-01 13:31:55 +01:00
add_cv Update copyright years. 2019-01-01 13:31:55 +01:00
add_lvalue_reference Update copyright years. 2019-01-01 13:31:55 +01:00
add_pointer Update copyright years. 2019-01-01 13:31:55 +01:00
add_rvalue_reference Update copyright years. 2019-01-01 13:31:55 +01:00
add_volatile Update copyright years. 2019-01-01 13:31:55 +01:00
addressof Update copyright years. 2019-01-01 13:31:55 +01:00
align Update copyright years. 2019-01-01 13:31:55 +01:00
aligned_storage Update copyright years. 2019-01-01 13:31:55 +01:00
aligned_union Update copyright years. 2019-01-01 13:31:55 +01:00
alignment_of Update copyright years. 2019-01-01 13:31:55 +01:00
allocator Update copyright years. 2019-01-01 13:31:55 +01:00
allocator_traits Update copyright years. 2019-01-01 13:31:55 +01:00
any Update copyright years. 2019-01-01 13:31:55 +01:00
as_const Update copyright years. 2019-01-01 13:31:55 +01:00
assume_aligned Update copyright years. 2019-01-01 13:31:55 +01:00
auto_ptr Update copyright years. 2019-01-01 13:31:55 +01:00
bad_function_call Update copyright years. 2019-01-01 13:31:55 +01:00
bind Update copyright years. 2019-01-01 13:31:55 +01:00
bool_constant Update copyright years. 2019-01-01 13:31:55 +01:00
common_type/requirements Update copyright years. 2019-01-01 13:31:55 +01:00
conditional/requirements Update copyright years. 2019-01-01 13:31:55 +01:00
decay/requirements Update copyright years. 2019-01-01 13:31:55 +01:00
declval/requirements Update copyright years. 2019-01-01 13:31:55 +01:00
default_delete Update copyright years. 2019-01-01 13:31:55 +01:00
duration Update copyright years. 2019-01-01 13:31:55 +01:00
duration_cast Update copyright years. 2019-01-01 13:31:55 +01:00
enable_if/requirements Update copyright years. 2019-01-01 13:31:55 +01:00
enable_shared_from_this Update copyright years. 2019-01-01 13:31:55 +01:00
endian Update copyright years. 2019-01-01 13:31:55 +01:00
exchange Update copyright years. 2019-01-01 13:31:55 +01:00
extent Update copyright years. 2019-01-01 13:31:55 +01:00
forward Update copyright years. 2019-01-01 13:31:55 +01:00
from_chars Update copyright years. 2019-01-01 13:31:55 +01:00
function Update copyright years. 2019-01-01 13:31:55 +01:00
function_objects Update copyright years. 2019-01-01 13:31:55 +01:00
has_unique_object_representations Update copyright years. 2019-01-01 13:31:55 +01:00
has_virtual_destructor Update copyright years. 2019-01-01 13:31:55 +01:00
hash Update copyright years. 2019-01-01 13:31:55 +01:00
headers Update copyright years. 2019-01-01 13:31:55 +01:00
in_place Update copyright years. 2019-01-01 13:31:55 +01:00
integer_sequence Update copyright years. 2019-01-01 13:31:55 +01:00
integral_constant Update copyright years. 2019-01-01 13:31:55 +01:00
is_abstract Update copyright years. 2019-01-01 13:31:55 +01:00
is_aggregate Update copyright years. 2019-01-01 13:31:55 +01:00
is_arithmetic Update copyright years. 2019-01-01 13:31:55 +01:00
is_array Update copyright years. 2019-01-01 13:31:55 +01:00
is_assignable Update copyright years. 2019-01-01 13:31:55 +01:00
is_base_of Update copyright years. 2019-01-01 13:31:55 +01:00
is_class Update copyright years. 2019-01-01 13:31:55 +01:00
is_compound Update copyright years. 2019-01-01 13:31:55 +01:00
is_const Update copyright years. 2019-01-01 13:31:55 +01:00
is_constant_evaluated Update copyright years. 2019-01-01 13:31:55 +01:00
is_constructible Update copyright years. 2019-01-01 13:31:55 +01:00
is_convertible Update copyright years. 2019-01-01 13:31:55 +01:00
is_copy_assignable Update copyright years. 2019-01-01 13:31:55 +01:00
is_copy_constructible Update copyright years. 2019-01-01 13:31:55 +01:00
is_default_constructible Update copyright years. 2019-01-01 13:31:55 +01:00
is_destructible Update copyright years. 2019-01-01 13:31:55 +01:00
is_empty Update copyright years. 2019-01-01 13:31:55 +01:00
is_enum Update copyright years. 2019-01-01 13:31:55 +01:00
is_final Update copyright years. 2019-01-01 13:31:55 +01:00
is_floating_point Update copyright years. 2019-01-01 13:31:55 +01:00
is_function Update copyright years. 2019-01-01 13:31:55 +01:00
is_fundamental Update copyright years. 2019-01-01 13:31:55 +01:00
is_implicitly_default_constructible Update copyright years. 2019-01-01 13:31:55 +01:00
is_integral Update copyright years. 2019-01-01 13:31:55 +01:00
is_invocable Update copyright years. 2019-01-01 13:31:55 +01:00
is_literal_type Update copyright years. 2019-01-01 13:31:55 +01:00
is_lvalue_reference Update copyright years. 2019-01-01 13:31:55 +01:00
is_member_function_pointer Update copyright years. 2019-01-01 13:31:55 +01:00
is_member_object_pointer Update copyright years. 2019-01-01 13:31:55 +01:00
is_member_pointer Update copyright years. 2019-01-01 13:31:55 +01:00
is_move_assignable Update copyright years. 2019-01-01 13:31:55 +01:00
is_move_constructible Update copyright years. 2019-01-01 13:31:55 +01:00
is_nothrow_assignable Update copyright years. 2019-01-01 13:31:55 +01:00
is_nothrow_constructible Update copyright years. 2019-01-01 13:31:55 +01:00
is_nothrow_convertible Update copyright years. 2019-01-01 13:31:55 +01:00
is_nothrow_copy_assignable Update copyright years. 2019-01-01 13:31:55 +01:00
is_nothrow_copy_constructible Update copyright years. 2019-01-01 13:31:55 +01:00
is_nothrow_default_constructible Update copyright years. 2019-01-01 13:31:55 +01:00
is_nothrow_destructible Update copyright years. 2019-01-01 13:31:55 +01:00
is_nothrow_invocable Update copyright years. 2019-01-01 13:31:55 +01:00
is_nothrow_move_assignable Update copyright years. 2019-01-01 13:31:55 +01:00
is_nothrow_move_constructible Update copyright years. 2019-01-01 13:31:55 +01:00
is_nothrow_swappable Update copyright years. 2019-01-01 13:31:55 +01:00
is_nothrow_swappable_with Update copyright years. 2019-01-01 13:31:55 +01:00
is_null_pointer Update copyright years. 2019-01-01 13:31:55 +01:00
is_object Update copyright years. 2019-01-01 13:31:55 +01:00
is_pod Update copyright years. 2019-01-01 13:31:55 +01:00
is_pointer Update copyright years. 2019-01-01 13:31:55 +01:00
is_polymorphic Update copyright years. 2019-01-01 13:31:55 +01:00
is_reference Update copyright years. 2019-01-01 13:31:55 +01:00
is_rvalue_reference Update copyright years. 2019-01-01 13:31:55 +01:00
is_same Update copyright years. 2019-01-01 13:31:55 +01:00
is_scalar Update copyright years. 2019-01-01 13:31:55 +01:00
is_signed Update copyright years. 2019-01-01 13:31:55 +01:00
is_standard_layout Update copyright years. 2019-01-01 13:31:55 +01:00
is_swappable Update copyright years. 2019-01-01 13:31:55 +01:00
is_swappable_with Update copyright years. 2019-01-01 13:31:55 +01:00
is_trivial Update copyright years. 2019-01-01 13:31:55 +01:00
is_trivially_assignable Update copyright years. 2019-01-01 13:31:55 +01:00
is_trivially_constructible Update copyright years. 2019-01-01 13:31:55 +01:00
is_trivially_copy_assignable Update copyright years. 2019-01-01 13:31:55 +01:00
is_trivially_copy_constructible Update copyright years. 2019-01-01 13:31:55 +01:00
is_trivially_copyable Update copyright years. 2019-01-01 13:31:55 +01:00
is_trivially_default_constructible Update copyright years. 2019-01-01 13:31:55 +01:00
is_trivially_destructible Update copyright years. 2019-01-01 13:31:55 +01:00
is_trivially_move_assignable Update copyright years. 2019-01-01 13:31:55 +01:00
is_trivially_move_constructible Update copyright years. 2019-01-01 13:31:55 +01:00
is_union Update copyright years. 2019-01-01 13:31:55 +01:00
is_unsigned Update copyright years. 2019-01-01 13:31:55 +01:00
is_void Update copyright years. 2019-01-01 13:31:55 +01:00
is_volatile Update copyright years. 2019-01-01 13:31:55 +01:00
logical_traits Update copyright years. 2019-01-01 13:31:55 +01:00
make_signed/requirements Update copyright years. 2019-01-01 13:31:55 +01:00
make_unsigned/requirements Update copyright years. 2019-01-01 13:31:55 +01:00
memory_resource Update copyright years. 2019-01-01 13:31:55 +01:00
monotonic_buffer_resource Update copyright years. 2019-01-01 13:31:55 +01:00
move Update copyright years. 2019-01-01 13:31:55 +01:00
move_if_noexcept Update copyright years. 2019-01-01 13:31:55 +01:00
optional Update copyright years. 2019-01-01 13:31:55 +01:00
owner_less Update copyright years. 2019-01-01 13:31:55 +01:00
pair Update copyright years. 2019-01-01 13:31:55 +01:00
pointer_safety Update copyright years. 2019-01-01 13:31:55 +01:00
pointer_traits Update copyright years. 2019-01-01 13:31:55 +01:00
polymorphic_allocator Update copyright years. 2019-01-01 13:31:55 +01:00
rank Update copyright years. 2019-01-01 13:31:55 +01:00
ratio Update copyright years. 2019-01-01 13:31:55 +01:00
raw_storage_iterator Update copyright years. 2019-01-01 13:31:55 +01:00
reference_wrapper Update copyright years. 2019-01-01 13:31:55 +01:00
remove_all_extents Update copyright years. 2019-01-01 13:31:55 +01:00
remove_const Update copyright years. 2019-01-01 13:31:55 +01:00
remove_cv Update copyright years. 2019-01-01 13:31:55 +01:00
remove_cvref Update copyright years. 2019-01-01 13:31:55 +01:00
remove_extent Update copyright years. 2019-01-01 13:31:55 +01:00
remove_pointer Update copyright years. 2019-01-01 13:31:55 +01:00
remove_reference Update copyright years. 2019-01-01 13:31:55 +01:00
remove_volatile Update copyright years. 2019-01-01 13:31:55 +01:00
result_of Update copyright years. 2019-01-01 13:31:55 +01:00
scoped_allocator Update copyright years. 2019-01-01 13:31:55 +01:00
shared_ptr Update copyright years. 2019-01-01 13:31:55 +01:00
specialized_algorithms Update copyright years. 2019-01-01 13:31:55 +01:00
steady_clock Update copyright years. 2019-01-01 13:31:55 +01:00
synchronized_pool_resource Update copyright years. 2019-01-01 13:31:55 +01:00
system_clock Update copyright years. 2019-01-01 13:31:55 +01:00
time_point Update copyright years. 2019-01-01 13:31:55 +01:00
time_point_cast Update copyright years. 2019-01-01 13:31:55 +01:00
to_address Update copyright years. 2019-01-01 13:31:55 +01:00
to_chars Update copyright years. 2019-01-01 13:31:55 +01:00
tuple Update copyright years. 2019-01-01 13:31:55 +01:00
type_identity/requirements Update copyright years. 2019-01-01 13:31:55 +01:00
typeindex Update copyright years. 2019-01-01 13:31:55 +01:00
underlying_type/requirements Update copyright years. 2019-01-01 13:31:55 +01:00
unique_ptr Update copyright years. 2019-01-01 13:31:55 +01:00
unsynchronized_pool_resource Update copyright years. 2019-01-01 13:31:55 +01:00
unwrap_reference Update copyright years. 2019-01-01 13:31:55 +01:00
uses_allocator Update copyright years. 2019-01-01 13:31:55 +01:00
variant PR libstdc++/87431 fix regression introduced by r264574 2019-01-06 20:52:34 +00:00
void_t Update copyright years. 2019-01-01 13:31:55 +01:00
weak_ptr Update copyright years. 2019-01-01 13:31:55 +01:00
rel_ops.cc Update copyright years. 2019-01-01 13:31:55 +01:00
temporary_buffer.cc Update copyright years. 2019-01-01 13:31:55 +01:00
variable_templates_for_traits.cc Update copyright years. 2019-01-01 13:31:55 +01:00