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
This commit is contained in:
Eric Fiselier 2017-02-09 19:01:22 +00:00
parent 29eeea00e1
commit a18ef6f1f9
2 changed files with 12 additions and 1 deletions

View File

@ -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...);
}

View File

@ -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();
}