aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Shen <timshen@google.com>2016-09-22 03:15:58 +0000
committerTim Shen <timshen@gcc.gnu.org>2016-09-22 03:15:58 +0000
commit41501d1ae708f6977d957b61f797fda15ce33f0b (patch)
treee30b1a795c8d8a407956e66b3e2f432308d98a84
parent77d7987a0cea2353b7bb1f11713577269d34c787 (diff)
downloadgcc-41501d1ae708f6977d957b61f797fda15ce33f0b.zip
gcc-41501d1ae708f6977d957b61f797fda15ce33f0b.tar.gz
gcc-41501d1ae708f6977d957b61f797fda15ce33f0b.tar.bz2
re PR libstdc++/77641 (std::variant copy-initialization fails for type with non-trivial constexpr ctor)
PR libstdc++/77641 * include/std/variant (_Variant_storage::_Variant_storage): Change _Variant_storage's union to be default constructible. * testsuite/20_util/variant/compile.cc: New test. From-SVN: r240340
-rw-r--r--libstdc++-v3/ChangeLog7
-rw-r--r--libstdc++-v3/include/std/variant29
-rw-r--r--libstdc++-v3/testsuite/20_util/variant/compile.cc9
3 files changed, 34 insertions, 11 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 7e7c346..0de2044 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,10 @@
+2016-09-22 Tim Shen <timshen@google.com>
+
+ PR libstdc++/77641
+ * include/std/variant (_Variant_storage::_Variant_storage):
+ Change _Variant_storage's union to be default constructible.
+ * testsuite/20_util/variant/compile.cc: New test.
+
2016-09-21 Ville Voutilainen <ville.voutilainen@gmail.com>
PR libstdc++/77288
diff --git a/libstdc++-v3/include/std/variant b/libstdc++-v3/include/std/variant
index 7dbb533..013884b 100644
--- a/libstdc++-v3/include/std/variant
+++ b/libstdc++-v3/include/std/variant
@@ -296,15 +296,9 @@ namespace __variant
{
constexpr _Variant_storage() = default;
- template<typename... _Args>
- constexpr _Variant_storage(in_place_index_t<0>, _Args&&... __args)
- : _M_first(in_place<0>, forward<_Args>(__args)...)
- { }
-
- template<size_t _Np, typename... _Args,
- typename = enable_if_t<0 < _Np && _Np < sizeof...(_Rest) + 1>>
+ template<size_t _Np, typename... _Args>
constexpr _Variant_storage(in_place_index_t<_Np>, _Args&&... __args)
- : _M_rest(in_place<_Np - 1>, forward<_Args>(__args)...)
+ : _M_union(in_place<_Np>, forward<_Args>(__args)...)
{ }
~_Variant_storage() = default;
@@ -313,14 +307,27 @@ namespace __variant
_M_storage() const
{
return const_cast<void*>(
- static_cast<const void*>(std::addressof(_M_first._M_storage)));
+ static_cast<const void*>(std::addressof(_M_union._M_first._M_storage)));
}
- union
+ union _Union
{
+ constexpr _Union() {};
+
+ template<typename... _Args>
+ constexpr _Union(in_place_index_t<0>, _Args&&... __args)
+ : _M_first(in_place<0>, forward<_Args>(__args)...)
+ { }
+
+ template<size_t _Np, typename... _Args,
+ typename = enable_if_t<0 < _Np && _Np < sizeof...(_Rest) + 1>>
+ constexpr _Union(in_place_index_t<_Np>, _Args&&... __args)
+ : _M_rest(in_place<_Np - 1>, forward<_Args>(__args)...)
+ { }
+
_Uninitialized<__storage<_First>> _M_first;
_Variant_storage<_Rest...> _M_rest;
- };
+ } _M_union;
};
template<typename _Derived, bool __is_trivially_destructible>
diff --git a/libstdc++-v3/testsuite/20_util/variant/compile.cc b/libstdc++-v3/testsuite/20_util/variant/compile.cc
index b57d356..99f980a 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() { }
+ };
+
+ constexpr std::variant<X> v1 = X{};
+}