commit 9f29dcfbb779ccbafc5b7b36192ef6b0d4826ec9 Author: Tim Shen Date: Tue Sep 20 10:50:10 2016 -0700 2016-09-20 Tim Shen 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. 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 - constexpr _Variant_storage(in_place_index_t<0>, _Args&&... __args) - : _M_first(in_place<0>, forward<_Args>(__args)...) - { } - - template> + template 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( - static_cast(std::addressof(_M_first._M_storage))); + static_cast(std::addressof(_M_union._M_first._M_storage))); } - union + union _Union { + constexpr _Union() {}; + + template + constexpr _Union(in_place_index_t<0>, _Args&&... __args) + : _M_first(in_place<0>, forward<_Args>(__args)...) + { } + + template> + 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 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 v1 = X{}; +}