commit 08235141a7e06db2b604b5869c9d8e4aaf8fa29b Author: Tim Shen Date: Tue Feb 14 13:55:18 2017 -0800 2017-02-14 Tim Shen PR libstdc++/79513 * include/std/variant (visit()): Forward variant types to the return type detection code. * testsuite/20_util/variant/compile.cc: Add test cases. diff --git a/libstdc++-v3/include/std/variant b/libstdc++-v3/include/std/variant index c5138e56803..866c4c40a61 100644 --- a/libstdc++-v3/include/std/variant +++ b/libstdc++-v3/include/std/variant @@ -1263,7 +1263,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __throw_bad_variant_access("Unexpected index"); using _Result_type = - decltype(std::forward<_Visitor>(__visitor)(get<0>(__variants)...)); + decltype(std::forward<_Visitor>(__visitor)( + get<0>(std::forward<_Variants>(__variants))...)); constexpr auto& __vtable = __detail::__variant::__gen_vtable< _Result_type, _Visitor&&, _Variants&&...>::_S_vtable; diff --git a/libstdc++-v3/testsuite/20_util/variant/compile.cc b/libstdc++-v3/testsuite/20_util/variant/compile.cc index 65f4326c397..d40a4ccb784 100644 --- a/libstdc++-v3/testsuite/20_util/variant/compile.cc +++ b/libstdc++-v3/testsuite/20_util/variant/compile.cc @@ -291,6 +291,13 @@ void test_visit() }; static_assert(visit(Visitor(), variant(0)), ""); } + // PR libstdc++/79513 + { + std::variant v(5); + std::visit([](int&){}, v); + std::visit([](int&&){}, std::move(v)); + (void)v; + } } void test_constexpr()