Implement correct std::variant triviality rules from P0602R4
The std::variant move assignment operator should not be trivial if the variant is not trivially move constructible. * include/std/variant (__detail::__variant::_Traits): Make _S_trivial_copy_assign depend on _S_trivial_copy_ctor and make _S_trivial_move_assign depend on _S_trivial_move_ctor, as per P0602R4. (__detail::__variant::_Copy_assign_alias): Only depend on _S_trivial_copy_assign, which subsumes _S_trivial_copy_ctor now. * testsuite/20_util/variant/compile.cc: Correct checks for trivial move assignment operators. From-SVN: r270510
This commit is contained in:
parent
06715e1cfb
commit
038bc9bfd6
3 changed files with 23 additions and 13 deletions
|
@ -1,5 +1,14 @@
|
|||
2019-04-23 Jonathan Wakely <jwakely@redhat.com>
|
||||
|
||||
* include/std/variant (__detail::__variant::_Traits): Make
|
||||
_S_trivial_copy_assign depend on _S_trivial_copy_ctor and make
|
||||
_S_trivial_move_assign depend on _S_trivial_move_ctor, as per
|
||||
P0602R4.
|
||||
(__detail::__variant::_Copy_assign_alias): Only depend on
|
||||
_S_trivial_copy_assign, which subsumes _S_trivial_copy_ctor now.
|
||||
* testsuite/20_util/variant/compile.cc: Correct checks for trivial
|
||||
move assignment operators.
|
||||
|
||||
PR libstdc++/90165
|
||||
* include/std/variant (variant::__not_self): New helper for the
|
||||
is_same_v<remove_cvref_t<T>, variant>==false constraints.
|
||||
|
|
|
@ -289,9 +289,11 @@ namespace __variant
|
|||
static constexpr bool _S_trivial_move_ctor =
|
||||
(is_trivially_move_constructible_v<_Types> && ...);
|
||||
static constexpr bool _S_trivial_copy_assign =
|
||||
_S_trivial_dtor && (is_trivially_copy_assignable_v<_Types> && ...);
|
||||
_S_trivial_dtor && _S_trivial_copy_ctor
|
||||
&& (is_trivially_copy_assignable_v<_Types> && ...);
|
||||
static constexpr bool _S_trivial_move_assign =
|
||||
_S_trivial_dtor && (is_trivially_move_assignable_v<_Types> && ...);
|
||||
_S_trivial_dtor && _S_trivial_move_ctor
|
||||
&& (is_trivially_move_assignable_v<_Types> && ...);
|
||||
|
||||
// The following nothrow traits are for non-trivial SMFs. Trivial SMFs
|
||||
// are always nothrow.
|
||||
|
@ -303,7 +305,8 @@ namespace __variant
|
|||
(is_nothrow_move_constructible_v<_Types> && ...);
|
||||
static constexpr bool _S_nothrow_copy_assign = false;
|
||||
static constexpr bool _S_nothrow_move_assign =
|
||||
_S_nothrow_move_ctor && (is_nothrow_move_assignable_v<_Types> && ...);
|
||||
_S_nothrow_move_ctor
|
||||
&& (is_nothrow_move_assignable_v<_Types> && ...);
|
||||
};
|
||||
|
||||
// Defines members and ctors.
|
||||
|
@ -654,9 +657,7 @@ namespace __variant
|
|||
|
||||
template<typename... _Types>
|
||||
using _Copy_assign_alias =
|
||||
_Copy_assign_base<_Traits<_Types...>::_S_trivial_copy_assign
|
||||
&& _Traits<_Types...>::_S_trivial_copy_ctor,
|
||||
_Types...>;
|
||||
_Copy_assign_base<_Traits<_Types...>::_S_trivial_copy_assign, _Types...>;
|
||||
|
||||
template<bool, typename... _Types>
|
||||
struct _Move_assign_base : _Copy_assign_alias<_Types...>
|
||||
|
|
|
@ -522,17 +522,17 @@ void test_triviality()
|
|||
TEST_TEMPLATE(=default, =default, =default, =default, , true, true, true, false)
|
||||
TEST_TEMPLATE(=default, =default, =default, , =default, true, true, false, true)
|
||||
TEST_TEMPLATE(=default, =default, =default, , , true, true, false, false)
|
||||
TEST_TEMPLATE(=default, =default, , =default, =default, true, false, true, true)
|
||||
TEST_TEMPLATE(=default, =default, , =default, =default, true, false, true, false)
|
||||
TEST_TEMPLATE(=default, =default, , =default, , true, false, true, false)
|
||||
TEST_TEMPLATE(=default, =default, , , =default, true, false, false, true)
|
||||
TEST_TEMPLATE(=default, =default, , , =default, true, false, false, false)
|
||||
TEST_TEMPLATE(=default, =default, , , , true, false, false, false)
|
||||
TEST_TEMPLATE(=default, , =default, =default, =default, false, true, false, true)
|
||||
TEST_TEMPLATE(=default, , =default, =default, , false, true, false, false)
|
||||
TEST_TEMPLATE(=default, , =default, =default, =default, false, true, false, true)
|
||||
TEST_TEMPLATE(=default, , =default, =default, , false, true, false, false)
|
||||
TEST_TEMPLATE(=default, , =default, , =default, false, true, false, true)
|
||||
TEST_TEMPLATE(=default, , =default, , , false, true, false, false)
|
||||
TEST_TEMPLATE(=default, , , =default, =default, false, false, false, true)
|
||||
TEST_TEMPLATE(=default, , , =default, , false, false, false, false)
|
||||
TEST_TEMPLATE(=default, , , , =default, false, false, false, true)
|
||||
TEST_TEMPLATE(=default, , , =default, =default, false, false, false, false)
|
||||
TEST_TEMPLATE(=default, , , =default, , false, false, false, false)
|
||||
TEST_TEMPLATE(=default, , , , =default, false, false, false, false)
|
||||
TEST_TEMPLATE(=default, , , , , false, false, false, false)
|
||||
TEST_TEMPLATE( , =default, =default, =default, =default, false, false, false, false)
|
||||
TEST_TEMPLATE( , =default, =default, =default, , false, false, false, false)
|
||||
|
|
Loading…
Add table
Reference in a new issue