[libcxx] r294681 - Merge r294612 - Fix PR31916 - std::visit rejects visitors accepting lvalue arguments
Eric Fiselier via cfe-commits
cfe-commits at lists.llvm.org
Thu Feb 9 16:37:47 PST 2017
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();
}
More information about the cfe-commits
mailing list