Commit 669a6fdc by Ville Voutilainen Committed by Ville Voutilainen

Rewrite variant, also PR libstdc++/85517

* include/std/variant (__do_visit): New.
(__variant_cast): Likewise.
(__variant_cookie): Likewise.
(__erased_*): Remove.
(_Variant_storage::_S_vtable): Likewise.
(_Variant_storage::__M_reset_impl): Adjust to use __do_visit.
(_Variant_storage::__M_reset): Adjust.
(__variant_construct): New.
(_Copy_ctor_base(const _Copy_ctor_base&)): Adjust to use
__variant_construct.
(_Move_ctor_base(_Move_ctor_base&&)): Likewise.
(_Move_ctor_base::__M_destructive_copy): New.
(_Move_ctor_base::__M_destructive_move): Adjust to use
__variant_construct.
(_Copy_assign_base::operator=): Adjust to use __do_visit.
(_Copy_assign_alias): Adjust to check both copy assignment
and copy construction for triviality.
(_Move_assign_base::operator=): Adjust to use __do_visit.
(_Multi_array): Add support for visitors that accept and return
a __variant_cookie.
(__gen_vtable_impl::_S_apply_all_alts): Likewise.
(__gen_vtable_impl::_S_apply_single_alt): Likewise.
(__gen_vtable_impl::__element_by_index_or_cookie): New. Generate
a __variant_cookie temporary for a variant that is valueless and..
(__gen_vtable_impl::__visit_invoke): ..adjust here.
(__gen_vtable::_Array_type): Conditionally make space for
the __variant_cookie visitor case.
(__variant_construct_by_index): New.
(get_if): Adjust to use std::addressof.
(relops): Adjust to use __do_visit.
(variant): Add __variant_cast and __variant_construct_by_index
as friends.
(variant::emplace): Use _M_reset() and __variant_construct_by_index
instead of self-destruction.
(variant::swap): Adjust to use __do_visit.
(visit): Reimplement in terms of __do_visit.
(__variant_hash_call_base_impl::operator()): Adjust to use __do_visit.
* testsuite/20_util/variant/compile.cc: Adjust.
* testsuite/20_util/variant/run.cc: Likewise.

From-SVN: r269422
parent 99447f70
2019-03-06 Ville Voutilainen <ville.voutilainen@gmail.com>
Rewrite variant.
Also PR libstdc++/85517
* include/std/variant (__do_visit): New.
(__variant_cast): Likewise.
(__variant_cookie): Likewise.
(__erased_*): Remove.
(_Variant_storage::_S_vtable): Likewise.
(_Variant_storage::__M_reset_impl): Adjust to use __do_visit.
(_Variant_storage::__M_reset): Adjust.
(__variant_construct): New.
(_Copy_ctor_base(const _Copy_ctor_base&)): Adjust to use
__variant_construct.
(_Move_ctor_base(_Move_ctor_base&&)): Likewise.
(_Move_ctor_base::__M_destructive_copy): New.
(_Move_ctor_base::__M_destructive_move): Adjust to use
__variant_construct.
(_Copy_assign_base::operator=): Adjust to use __do_visit.
(_Copy_assign_alias): Adjust to check both copy assignment
and copy construction for triviality.
(_Move_assign_base::operator=): Adjust to use __do_visit.
(_Multi_array): Add support for visitors that accept and return
a __variant_cookie.
(__gen_vtable_impl::_S_apply_all_alts): Likewise.
(__gen_vtable_impl::_S_apply_single_alt): Likewise.
(__gen_vtable_impl::__element_by_index_or_cookie): New. Generate
a __variant_cookie temporary for a variant that is valueless and..
(__gen_vtable_impl::__visit_invoke): ..adjust here.
(__gen_vtable::_Array_type): Conditionally make space for
the __variant_cookie visitor case.
(__variant_construct_by_index): New.
(get_if): Adjust to use std::addressof.
(relops): Adjust to use __do_visit.
(variant): Add __variant_cast and __variant_construct_by_index
as friends.
(variant::emplace): Use _M_reset() and __variant_construct_by_index
instead of self-destruction.
(variant::swap): Adjust to use __do_visit.
(visit): Reimplement in terms of __do_visit.
(__variant_hash_call_base_impl::operator()): Adjust to use __do_visit.
* testsuite/20_util/variant/compile.cc: Adjust.
* testsuite/20_util/variant/run.cc: Likewise.
2019-03-06 Jonathan Wakely <jwakely@redhat.com> 2019-03-06 Jonathan Wakely <jwakely@redhat.com>
* include/bits/c++config.h (_cpp_lib_char8_t): Add L suffix to * include/bits/c++config.h (_cpp_lib_char8_t): Add L suffix to
......
...@@ -488,12 +488,12 @@ void test_triviality() ...@@ -488,12 +488,12 @@ void test_triviality()
TEST_TEMPLATE(=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, true)
TEST_TEMPLATE(=default, =default, , , , true, false, false, false) TEST_TEMPLATE(=default, =default, , , , true, false, false, false)
TEST_TEMPLATE(=default, , =default, =default, =default, false, true, true, true) TEST_TEMPLATE(=default, , =default, =default, =default, false, true, false, true)
TEST_TEMPLATE(=default, , =default, =default, , false, true, true, false) TEST_TEMPLATE(=default, , =default, =default, , false, true, false, false)
TEST_TEMPLATE(=default, , =default, , =default, false, true, false, true) TEST_TEMPLATE(=default, , =default, , =default, false, true, false, true)
TEST_TEMPLATE(=default, , =default, , , false, true, false, false) TEST_TEMPLATE(=default, , =default, , , false, true, false, false)
TEST_TEMPLATE(=default, , , =default, =default, false, false, true, true) TEST_TEMPLATE(=default, , , =default, =default, false, false, false, true)
TEST_TEMPLATE(=default, , , =default, , false, false, true, false) TEST_TEMPLATE(=default, , , =default, , false, false, false, false)
TEST_TEMPLATE(=default, , , , =default, false, false, false, true) TEST_TEMPLATE(=default, , , , =default, false, false, false, true)
TEST_TEMPLATE(=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, =default, false, false, false, false)
......
...@@ -88,6 +88,21 @@ void arbitrary_ctor() ...@@ -88,6 +88,21 @@ void arbitrary_ctor()
VERIFY(get<1>(v) == "a"); VERIFY(get<1>(v) == "a");
} }
struct ThrowingMoveCtorThrowsCopyCtor
{
ThrowingMoveCtorThrowsCopyCtor() noexcept = default;
ThrowingMoveCtorThrowsCopyCtor(ThrowingMoveCtorThrowsCopyCtor&&) {}
ThrowingMoveCtorThrowsCopyCtor(ThrowingMoveCtorThrowsCopyCtor const&)
{
throw 0;
}
ThrowingMoveCtorThrowsCopyCtor& operator=(ThrowingMoveCtorThrowsCopyCtor&&) noexcept
= default;
ThrowingMoveCtorThrowsCopyCtor& operator=(ThrowingMoveCtorThrowsCopyCtor const&) noexcept
= default;
};
void copy_assign() void copy_assign()
{ {
variant<monostate, string> v("a"); variant<monostate, string> v("a");
...@@ -96,6 +111,20 @@ void copy_assign() ...@@ -96,6 +111,20 @@ void copy_assign()
u = v; u = v;
VERIFY(holds_alternative<string>(u)); VERIFY(holds_alternative<string>(u));
VERIFY(get<string>(u) == "a"); VERIFY(get<string>(u) == "a");
{
std::variant<int, ThrowingMoveCtorThrowsCopyCtor> v1,
v2 = ThrowingMoveCtorThrowsCopyCtor();
bool should_throw = false;
try
{
v1 = v2;
}
catch(int)
{
should_throw = true;
}
VERIFY(should_throw);
}
} }
void move_assign() void move_assign()
...@@ -183,11 +212,15 @@ void emplace() ...@@ -183,11 +212,15 @@ void emplace()
AlwaysThrow a; AlwaysThrow a;
try { v.emplace<1>(a); } catch (nullptr_t) { } try { v.emplace<1>(a); } catch (nullptr_t) { }
VERIFY(v.valueless_by_exception()); VERIFY(v.valueless_by_exception());
v.emplace<0>(42);
VERIFY(!v.valueless_by_exception());
} }
{ {
variant<int, AlwaysThrow> v; variant<int, AlwaysThrow> v;
try { v.emplace<1>(AlwaysThrow{}); } catch (nullptr_t) { } try { v.emplace<1>(AlwaysThrow{}); } catch (nullptr_t) { }
VERIFY(v.valueless_by_exception()); VERIFY(v.valueless_by_exception());
v.emplace<0>(42);
VERIFY(!v.valueless_by_exception());
} }
VERIFY(&v.emplace<0>(1) == &std::get<0>(v)); VERIFY(&v.emplace<0>(1) == &std::get<0>(v));
VERIFY(&v.emplace<int>(1) == &std::get<int>(v)); VERIFY(&v.emplace<int>(1) == &std::get<int>(v));
...@@ -258,6 +291,7 @@ void test_relational() ...@@ -258,6 +291,7 @@ void test_relational()
VERIFY(v < w); VERIFY(v < w);
VERIFY(v <= w); VERIFY(v <= w);
VERIFY(!(v == w)); VERIFY(!(v == w));
VERIFY(v == v);
VERIFY(v != w); VERIFY(v != w);
VERIFY(w > v); VERIFY(w > v);
VERIFY(w >= v); VERIFY(w >= v);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment