From def227f1ad99a7d366cda7ed72e748ebfb3bf797 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Mon, 13 Feb 2017 13:13:29 +0000 Subject: [PATCH] PR libstdc++/79486 use lvalues in result_of expressions PR libstdc++/79486 * include/std/future (__future_base::_Task_state::_M_run) (__future_base::_Task_state::_M_run_delayed): Use lvalue types in result_of expressions. * testsuite/30_threads/packaged_task/79486.cc: New. From-SVN: r245386 --- libstdc++-v3/ChangeLog | 8 ++++++ libstdc++-v3/include/std/future | 4 +-- .../30_threads/packaged_task/79486.cc | 27 +++++++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 libstdc++-v3/testsuite/30_threads/packaged_task/79486.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 4f5656bf867..453143fddd9 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,11 @@ +2017-02-13 Jonathan Wakely + + PR libstdc++/79486 + * include/std/future (__future_base::_Task_state::_M_run) + (__future_base::_Task_state::_M_run_delayed): Use lvalue types in + result_of expressions. + * testsuite/30_threads/packaged_task/79486.cc: New. + 2017-02-11 Jonathan Wakely PR libstdc++/79467 diff --git a/libstdc++-v3/include/std/future b/libstdc++-v3/include/std/future index 6351d7ef494..cb53561472d 100644 --- a/libstdc++-v3/include/std/future +++ b/libstdc++-v3/include/std/future @@ -1416,7 +1416,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION virtual void _M_run(_Args&&... __args) { - auto __boundfn = [&] () -> typename result_of<_Fn(_Args&&...)>::type { + auto __boundfn = [&] () -> typename result_of<_Fn&(_Args&&...)>::type { return std::__invoke(_M_impl._M_fn, std::forward<_Args>(__args)...); }; this->_M_set_result(_S_task_setter(this->_M_result, __boundfn)); @@ -1425,7 +1425,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION virtual void _M_run_delayed(_Args&&... __args, weak_ptr<_State_base> __self) { - auto __boundfn = [&] () -> typename result_of<_Fn(_Args&&...)>::type { + auto __boundfn = [&] () -> typename result_of<_Fn&(_Args&&...)>::type { return std::__invoke(_M_impl._M_fn, std::forward<_Args>(__args)...); }; this->_M_set_delayed_result(_S_task_setter(this->_M_result, __boundfn), diff --git a/libstdc++-v3/testsuite/30_threads/packaged_task/79486.cc b/libstdc++-v3/testsuite/30_threads/packaged_task/79486.cc new file mode 100644 index 00000000000..46b4f3d54e5 --- /dev/null +++ b/libstdc++-v3/testsuite/30_threads/packaged_task/79486.cc @@ -0,0 +1,27 @@ +// Copyright (C) 2017 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-do compile { target c++11 } } + +#include + +struct F { + void operator()() & { } + void operator()() && = delete; // PR libstdc++/79486 +}; + +std::packaged_task t{F{}}; -- 2.30.2