[libcxx] r294612 - Fix PR31916 - std::visit rejects visitors accepting lvalue arguments
Hans Wennborg via cfe-commits
cfe-commits at lists.llvm.org
Thu Feb 9 13:56:36 PST 2017
Sounds good to me. You said "these changes"; are there more than this one?
On Thu, Feb 9, 2017 at 11:15 AM, Eric Fiselier <eric at efcs.ca> wrote:
> I'm planning to merge this fix into the 4.0 release branch.
>
> Although not a regression, since <variant> is a new feature, it would still
> be nice to ship without this bug.
>
> I'll merge these changes later today if there are no objections, and once
> all the bots pass.
>
> /Eric
>
> On Thu, Feb 9, 2017 at 12:01 PM, Eric Fiselier via cfe-commits
> <cfe-commits at lists.llvm.org> wrote:
>>
>> Author: ericwf
>> Date: Thu Feb 9 13:01:22 2017
>> New Revision: 294612
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=294612&view=rev
>> Log:
>> 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/trunk/include/variant
>> libcxx/trunk/test/std/utilities/variant/variant.visit/visit.pass.cpp
>>
>> Modified: libcxx/trunk/include/variant
>> URL:
>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/variant?rev=294612&r1=294611&r2=294612&view=diff
>>
>> ==============================================================================
>> --- libcxx/trunk/include/variant (original)
>> +++ libcxx/trunk/include/variant Thu Feb 9 13:01:22 2017
>> @@ -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...);
>> }
>>
>> Modified:
>> libcxx/trunk/test/std/utilities/variant/variant.visit/visit.pass.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/variant/variant.visit/visit.pass.cpp?rev=294612&r1=294611&r2=294612&view=diff
>>
>> ==============================================================================
>> --- libcxx/trunk/test/std/utilities/variant/variant.visit/visit.pass.cpp
>> (original)
>> +++ libcxx/trunk/test/std/utilities/variant/variant.visit/visit.pass.cpp
>> Thu Feb 9 13:01:22 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 at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
>
More information about the cfe-commits
mailing list