From d8b62dceb22903184109eeadb90612bcc17ac367 Mon Sep 17 00:00:00 2001 From: Eric Fiselier Date: Thu, 9 Feb 2017 19:01:22 +0000 Subject: [PATCH] Fix PR31916 - std::visit rejects visitors accepting lvalue arguments A static assertion was misfiring since it checked is_callable.value)>. However the decltype expression doesn't capture the value category as required. This patch applies extra braces to decltype to fix that. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@294612 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/variant | 2 +- .../utilities/variant/variant.visit/visit.pass.cpp | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/include/variant b/include/variant index fb7cb2e20..099e6c358 100644 --- a/include/variant +++ b/include/variant @@ -578,7 +578,7 @@ private: constexpr decltype(auto) operator()(_Alts&&... __alts) const { __std_visit_exhaustive_visitor_check< _Visitor, - decltype(_VSTD::forward<_Alts>(__alts).__value)...>(); + decltype((_VSTD::forward<_Alts>(__alts).__value))...>(); return __invoke_constexpr(_VSTD::forward<_Visitor>(__visitor), _VSTD::forward<_Alts>(__alts).__value...); } diff --git a/test/std/utilities/variant/variant.visit/visit.pass.cpp b/test/std/utilities/variant/variant.visit/visit.pass.cpp index 46d225883..408a65c09 100644 --- a/test/std/utilities/variant/variant.visit/visit.pass.cpp +++ b/test/std/utilities/variant/variant.visit/visit.pass.cpp @@ -283,9 +283,20 @@ void test_exceptions() { #endif } +// See http://llvm.org/PR31916 +void test_caller_accepts_nonconst() { + struct A {}; + struct Visitor { + void operator()(A&) {} + }; + std::variant v; + std::visit(Visitor{}, v); +} + int main() { test_call_operator_forwarding(); test_argument_forwarding(); test_constexpr(); test_exceptions(); + test_caller_accepts_nonconst(); }