As noted in bugzilla PR 77641 I don't think is_literal_type is the
right condition for _Uninitialized, because a type can have a
non-trivial default constructor but still be literal, but that means
it can't be used in the union in _Variant_storage.
I'm not sure if the right condition is is_literal &&
is_trivially_default_constructible, or if this is enough:
PR libstdc++/77641
* include/std/variant (__detail::__variant::_Uninitialized): Check
is_trivially_default_constructible_v instead of is_literal_type_v.
* testsuite/20_util/variant/compile.cc: Test literal type with
non-trivial default constructor.
Tim, are there case that this doesn't handle, where we need is_literal
as well? (bear in mind that is_trivially_default_constructible also
depends on trivially destructible).
Tested powerpc64le-linux with no failures.
commit 0d5f60751145f81d914d7411e0f4d79546e06fed
Author: Jonathan Wakely <[email protected]>
Date: Mon Sep 19 13:18:07 2016 +0100
libstdc++/77641 fix std::variant for literal types
PR libstdc++/77641
* include/std/variant (__detail::__variant::_Uninitialized): Check
is_trivially_default_constructible_v instead of is_literal_type_v.
* testsuite/20_util/variant/compile.cc: Test literal type with
non-trivial default constructor.
diff --git a/libstdc++-v3/include/std/variant b/libstdc++-v3/include/std/variant
index 7dbb533..6c090f6 100644
--- a/libstdc++-v3/include/std/variant
+++ b/libstdc++-v3/include/std/variant
@@ -168,7 +168,7 @@ namespace __variant
template<typename _Type>
using __storage = typename __storage_type<_Type>::type;
- template<typename _Type, bool __is_literal = std::is_literal_type_v<_Type>>
+ template<typename _Type, bool = is_trivially_default_constructible_v<_Type>>
struct _Uninitialized;
template<typename _Type>
diff --git a/libstdc++-v3/testsuite/20_util/variant/compile.cc
b/libstdc++-v3/testsuite/20_util/variant/compile.cc
index b57d356..3042a2e 100644
--- a/libstdc++-v3/testsuite/20_util/variant/compile.cc
+++ b/libstdc++-v3/testsuite/20_util/variant/compile.cc
@@ -403,3 +403,12 @@ void test_void()
v = 3;
v = "asdf";
}
+
+void test_pr77641()
+{
+ struct X {
+ constexpr X() { }
+ };
+
+ std::variant<X> v1 = X{};
+}