Author: ericwf Date: Thu Feb 9 18:37:47 2017 New Revision: 294681 URL: http://llvm.org/viewvc/llvm-project?rev=294681&view=rev Log: Merge r294612 - Fix PR31916 - std::visit rejects visitors accepting lvalue arguments
A static assertion was misfiring since it checked is_callable<Visitor, decltype(__variant_alt<T>.value)>. However the decltype expression doesn't capture the value category as required. This patch applies extra braces to decltype to fix that. Modified: libcxx/branches/release_40/include/variant libcxx/branches/release_40/test/std/utilities/variant/variant.visit/visit.pass.cpp Modified: libcxx/branches/release_40/include/variant URL: http://llvm.org/viewvc/llvm-project/libcxx/branches/release_40/include/variant?rev=294681&r1=294680&r2=294681&view=diff ============================================================================== --- libcxx/branches/release_40/include/variant (original) +++ libcxx/branches/release_40/include/variant Thu Feb 9 18:37:47 2017 @@ -574,7 +574,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...); } Modified: libcxx/branches/release_40/test/std/utilities/variant/variant.visit/visit.pass.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/branches/release_40/test/std/utilities/variant/variant.visit/visit.pass.cpp?rev=294681&r1=294680&r2=294681&view=diff ============================================================================== --- libcxx/branches/release_40/test/std/utilities/variant/variant.visit/visit.pass.cpp (original) +++ libcxx/branches/release_40/test/std/utilities/variant/variant.visit/visit.pass.cpp Thu Feb 9 18:37:47 2017 @@ -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<A> v; + std::visit(Visitor{}, v); +} + int main() { test_call_operator_forwarding(); test_argument_forwarding(); test_constexpr(); test_exceptions(); + test_caller_accepts_nonconst(); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits