summaryrefslogtreecommitdiffstats
path: root/libcxx
diff options
context:
space:
mode:
authorEric Fiselier <eric@efcs.ca>2017-02-09 19:01:22 +0000
committerEric Fiselier <eric@efcs.ca>2017-02-09 19:01:22 +0000
commita18ef6f1f9d2a32519192feedadb7814461db488 (patch)
tree4fc1e1307463d028cfcdc4661bc1dab955142192 /libcxx
parent29eeea00e12ee33728ead258c7d6466d79f8ca1d (diff)
downloadbcm5719-llvm-a18ef6f1f9d2a32519192feedadb7814461db488.tar.gz
bcm5719-llvm-a18ef6f1f9d2a32519192feedadb7814461db488.zip
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. llvm-svn: 294612
Diffstat (limited to 'libcxx')
-rw-r--r--libcxx/include/variant2
-rw-r--r--libcxx/test/std/utilities/variant/variant.visit/visit.pass.cpp11
2 files changed, 12 insertions, 1 deletions
diff --git a/libcxx/include/variant b/libcxx/include/variant
index fb7cb2e20e5..099e6c35849 100644
--- a/libcxx/include/variant
+++ b/libcxx/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/libcxx/test/std/utilities/variant/variant.visit/visit.pass.cpp b/libcxx/test/std/utilities/variant/variant.visit/visit.pass.cpp
index 46d225883ae..408a65c0903 100644
--- a/libcxx/test/std/utilities/variant/variant.visit/visit.pass.cpp
+++ b/libcxx/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<A> v;
+ std::visit(Visitor{}, v);
+}
+
int main() {
test_call_operator_forwarding();
test_argument_forwarding();
test_constexpr();
test_exceptions();
+ test_caller_accepts_nonconst();
}
OpenPOWER on IntegriCloud