diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2016-08-05 10:00:34 +0100 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2016-08-05 10:00:34 +0100 |
commit | 98e6e662332b75149288e6f1e1171e0b131a8981 (patch) | |
tree | e80aba6d88bc64cc6ae74dbed81b236ba8fc54d8 | |
parent | db7c335e162876b4c5e3e9e0b5e48ea5febda798 (diff) | |
download | gcc-98e6e662332b75149288e6f1e1171e0b131a8981.zip gcc-98e6e662332b75149288e6f1e1171e0b131a8981.tar.gz gcc-98e6e662332b75149288e6f1e1171e0b131a8981.tar.bz2 |
Use __invoke in std::function internals
* include/std/functional (__callable_functor): Remove.
(_Function_handler::_M_invoke): Use __invoke instead of
__callable_functor or mem_fn.
(function::_Callable): Use lvalue in result_of expression.
(function): Remove TODO comments about allocators.
* testsuite/20_util/function/cons/refqual.cc: New test.
From-SVN: r239166
-rw-r--r-- | libstdc++-v3/ChangeLog | 9 | ||||
-rw-r--r-- | libstdc++-v3/include/std/functional | 58 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/20_util/function/cons/refqual.cc | 31 |
3 files changed, 49 insertions, 49 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 5c4bb5c..c6df8ab 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,12 @@ +2016-08-05 Jonathan Wakely <jwakely@redhat.com> + + * include/std/functional (__callable_functor): Remove. + (_Function_handler::_M_invoke): Use __invoke instead of + __callable_functor or mem_fn. + (function::_Callable): Use lvalue in result_of expression. + (function): Remove TODO comments about allocators. + * testsuite/20_util/function/cons/refqual.cc: New test. + 2016-08-04 Jonathan Wakely <jwakely@redhat.com> * doc/xml/manual/status_cxx2017.xml: Update status table. diff --git a/libstdc++-v3/include/std/functional b/libstdc++-v3/include/std/functional index 843dc83..4ca32c3 100644 --- a/libstdc++-v3/include/std/functional +++ b/libstdc++-v3/include/std/functional @@ -1483,33 +1483,6 @@ _GLIBCXX_MEM_FN_TRAITS(&&, false_type, true_type) : __is_location_invariant<_Tp> { }; - // Converts a reference to a function object into a callable - // function object. - template<typename _Functor> - inline _Functor& - __callable_functor(_Functor& __f) - { return __f; } - - template<typename _Member, typename _Class> - inline _Mem_fn<_Member _Class::*> - __callable_functor(_Member _Class::* &__p) - { return std::mem_fn(__p); } - - template<typename _Member, typename _Class> - inline _Mem_fn<_Member _Class::*> - __callable_functor(_Member _Class::* const &__p) - { return std::mem_fn(__p); } - - template<typename _Member, typename _Class> - inline _Mem_fn<_Member _Class::*> - __callable_functor(_Member _Class::* volatile &__p) - { return std::mem_fn(__p); } - - template<typename _Member, typename _Class> - inline _Mem_fn<_Member _Class::*> - __callable_functor(_Member _Class::* const volatile &__p) - { return std::mem_fn(__p); } - template<typename _Signature> class function; @@ -1731,8 +1704,8 @@ _GLIBCXX_MEM_FN_TRAITS(&&, false_type, true_type) static _Res _M_invoke(const _Any_data& __functor, _ArgTypes&&... __args) { - return std::__callable_functor(**_Base::_M_get_pointer(__functor))( - std::forward<_ArgTypes>(__args)...); + return std::__invoke(**_Base::_M_get_pointer(__functor), + std::forward<_ArgTypes>(__args)...); } }; @@ -1746,8 +1719,8 @@ _GLIBCXX_MEM_FN_TRAITS(&&, false_type, true_type) static void _M_invoke(const _Any_data& __functor, _ArgTypes&&... __args) { - std::__callable_functor(**_Base::_M_get_pointer(__functor))( - std::forward<_ArgTypes>(__args)...); + std::__invoke(**_Base::_M_get_pointer(__functor), + std::forward<_ArgTypes>(__args)...); } }; @@ -1763,8 +1736,8 @@ _GLIBCXX_MEM_FN_TRAITS(&&, false_type, true_type) static _Res _M_invoke(const _Any_data& __functor, _ArgTypes&&... __args) { - return std::mem_fn(_Base::_M_get_pointer(__functor)->__value)( - std::forward<_ArgTypes>(__args)...); + return std::__invoke(_Base::_M_get_pointer(__functor)->__value, + std::forward<_ArgTypes>(__args)...); } }; @@ -1803,8 +1776,8 @@ _GLIBCXX_MEM_FN_TRAITS(&&, false_type, true_type) static void _M_invoke(const _Any_data& __functor, _ArgTypes&&... __args) { - std::mem_fn(_Base::_M_get_pointer(__functor)->__value)( - std::forward<_ArgTypes>(__args)...); + std::__invoke(_Base::_M_get_pointer(__functor)->__value, + std::forward<_ArgTypes>(__args)...); } }; @@ -1826,7 +1799,7 @@ _GLIBCXX_MEM_FN_TRAITS(&&, false_type, true_type) typedef _Res _Signature_type(_ArgTypes...); template<typename _Func, - typename _Res2 = typename result_of<_Func(_ArgTypes...)>::type> + typename _Res2 = typename result_of<_Func&(_ArgTypes...)>::type> struct _Callable : __check_func_return_type<_Res2, _Res> { }; // Used so the return type convertibility checks aren't done when @@ -1878,8 +1851,6 @@ _GLIBCXX_MEM_FN_TRAITS(&&, false_type, true_type) __x.swap(*this); } - // TODO: needs allocator_arg_t - /** * @brief Builds a %function that targets a copy of the incoming * function object. @@ -2006,17 +1977,6 @@ _GLIBCXX_MEM_FN_TRAITS(&&, false_type, true_type) std::swap(_M_invoker, __x._M_invoker); } - // TODO: needs allocator_arg_t - /* - template<typename _Functor, typename _Alloc> - void - assign(_Functor&& __f, const _Alloc& __a) - { - function(allocator_arg, __a, - std::forward<_Functor>(__f)).swap(*this); - } - */ - // [3.7.2.3] function capacity /** diff --git a/libstdc++-v3/testsuite/20_util/function/cons/refqual.cc b/libstdc++-v3/testsuite/20_util/function/cons/refqual.cc new file mode 100644 index 0000000..2370579 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/function/cons/refqual.cc @@ -0,0 +1,31 @@ +// Copyright (C) 2016 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 +// <http://www.gnu.org/licenses/>. + +// { dg-do compile { target c++11 } } + +#include <functional> + +struct F { + void operator()() && { } + int operator()() & { return 0; } +}; + +int main() { + F f; + std::function<int()> ff{f}; + return ff(); +} |