[libcxx] 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:21:41 PST 2017
This change stands on it's own. But I think there were another couple of
<variant> bug fixes in the past week.
I'm going to look into merging those as well.
/Eric
On Thu, Feb 9, 2017 at 2:56 PM, Hans Wennborg <hans at chromium.org> wrote:
> 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
> >
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170209/8372b21a/attachment.html>
More information about the cfe-commits
mailing list