From 98e6e662332b75149288e6f1e1171e0b131a8981 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Fri, 5 Aug 2016 10:00:34 +0100 Subject: [PATCH] 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 --- libstdc++-v3/ChangeLog | 9 +++ libstdc++-v3/include/std/functional | 58 +++---------------- .../20_util/function/cons/refqual.cc | 31 ++++++++++ 3 files changed, 49 insertions(+), 49 deletions(-) create mode 100644 libstdc++-v3/testsuite/20_util/function/cons/refqual.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 5c4bb5c2605..c6df8abfa64 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,12 @@ +2016-08-05 Jonathan Wakely + + * 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 * doc/xml/manual/status_cxx2017.xml: Update status table. diff --git a/libstdc++-v3/include/std/functional b/libstdc++-v3/include/std/functional index 843dc83e761..4ca32c3ef07 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 - inline _Functor& - __callable_functor(_Functor& __f) - { return __f; } - - template - inline _Mem_fn<_Member _Class::*> - __callable_functor(_Member _Class::* &__p) - { return std::mem_fn(__p); } - - template - inline _Mem_fn<_Member _Class::*> - __callable_functor(_Member _Class::* const &__p) - { return std::mem_fn(__p); } - - template - inline _Mem_fn<_Member _Class::*> - __callable_functor(_Member _Class::* volatile &__p) - { return std::mem_fn(__p); } - - template - inline _Mem_fn<_Member _Class::*> - __callable_functor(_Member _Class::* const volatile &__p) - { return std::mem_fn(__p); } - template 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::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 - 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 00000000000..23705796557 --- /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 +// . + +// { dg-do compile { target c++11 } } + +#include + +struct F { + void operator()() && { } + int operator()() & { return 0; } +}; + +int main() { + F f; + std::function ff{f}; + return ff(); +} -- 2.30.2