diff options
author | Tim Shen <timshen@google.com> | 2016-09-22 03:15:58 +0000 |
---|---|---|
committer | Tim Shen <timshen@gcc.gnu.org> | 2016-09-22 03:15:58 +0000 |
commit | 41501d1ae708f6977d957b61f797fda15ce33f0b (patch) | |
tree | e30b1a795c8d8a407956e66b3e2f432308d98a84 | |
parent | 77d7987a0cea2353b7bb1f11713577269d34c787 (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | libstdc++-v3/include/std/variant | 29 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/20_util/variant/compile.cc | 9 |
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{}; +} |