Implement LWG 2904 for std::variant assignment

Programming / Compilers / GCC - redi [138bc75d-0d04-0410-961f-82ee72b054a4] - 23 April 2019 23:01 EDT

- include/std/variant (__variant_construct): Use template parameter type instead of equivalent decltype-specifier. (_Move_ctor_base::_Move_ctor_base(_Move_ctor_base&&)): Replace forward with move. (_Move_ctor_base::_M_destructive_move) (_Move_ctor_base::_M_destructive_copy) (_Move_ctor_base::_M_destructive_move) (_Move_ctor_base::_M_destructive_copy): Only set the index after construction succeeds. (_Copy_assign_base::operator=): Remove redundant if-constexpr checks that are always true. Use __remove_cvref_t instead of remove_reference so that is_nothrow_move_constructible check doesn't use a const rvalue parameter. In the potentially-throwing case construct a temporary and move assign it, as per LWG 2904. (_Move_assign_base::operator=): Remove redundant if-constexpr checks that are always true. Use emplace as per LWG 2904. (variant::operator=(T&&)): Only use emplace conditionally, otherwise construct a temporary and move assign from it, as per LWG 2904.
- testsuite/20_util/variant/exception_safety.cc: Check that assignment operators have strong exception safety guarantee.

fd1863e18d0 Implement LWG 2904 for std::variant assignment
libstdc++-v3/ChangeLog | 23 ++++++
libstdc++-v3/include/std/variant | 94 ++++++++--------------
.../testsuite/20_util/variant/exception_safety.cc | 41 ++++++++++
3 files changed, 96 insertions(+), 62 deletions(-)

Upstream: gcc.gnu.org


  • Share