diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2015-12-21 13:02:12 +0000 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2015-12-21 13:02:12 +0000 |
commit | e9e6a995380186401dd75b2dfb4331e2c85e9e25 (patch) | |
tree | 82b73412fbff377fca5f63f509f551e83fa3989c | |
parent | c453c55157e3738dc0ffb3b44817bcdc93cdfd55 (diff) | |
download | gcc-e9e6a995380186401dd75b2dfb4331e2c85e9e25.zip gcc-e9e6a995380186401dd75b2dfb4331e2c85e9e25.tar.gz gcc-e9e6a995380186401dd75b2dfb4331e2c85e9e25.tar.bz2 |
libstdc++/68276 consistently qualify std::forward
PR libstdc++/68276
* include/std/functional (__invoke_impl, _Mem_fn::operator()): Qualify
std::forward.
testsuite/20_util/function_objects/mem_fn/68276.cc: New.
From-SVN: r231879
-rw-r--r-- | libstdc++-v3/ChangeLog | 7 | ||||
-rw-r--r-- | libstdc++-v3/include/std/functional | 23 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/20_util/function_objects/mem_fn/68276.cc | 45 |
3 files changed, 66 insertions, 9 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 1a79ff8..8ea4538 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2015-12-21 Jonathan Wakely <jwakely@redhat.com> + + PR libstdc++/68276 + * include/std/functional (__invoke_impl, _Mem_fn::operator()): Qualify + std::forward. + testsuite/20_util/function_objects/mem_fn/68276.cc: New. + 2015-12-21 Ville Voutilainen <ville.voutilainen@gmail.com> PR libstdc++/66693 diff --git a/libstdc++-v3/include/std/functional b/libstdc++-v3/include/std/functional index ff29a57..4d08e12 100644 --- a/libstdc++-v3/include/std/functional +++ b/libstdc++-v3/include/std/functional @@ -221,15 +221,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION inline _Res __invoke_impl(__invoke_memfun_ref, _MemFun&& __f, _Tp&& __t, _Args&&... __args) - noexcept(noexcept((__invfwd<_Tp>(__t).*__f)(forward<_Args>(__args)...))) - { return (__invfwd<_Tp>(__t).*__f)(forward<_Args>(__args)...); } + noexcept(noexcept( + (__invfwd<_Tp>(__t).*__f)(std::forward<_Args>(__args)...))) + { return (__invfwd<_Tp>(__t).*__f)(std::forward<_Args>(__args)...); } template<typename _Res, typename _MemFun, typename _Tp, typename... _Args> inline _Res __invoke_impl(__invoke_memfun_deref, _MemFun&& __f, _Tp&& __t, _Args&&... __args) - noexcept(noexcept(((*forward<_Tp>(__t)).*__f)(forward<_Args>(__args)...))) - { return ((*forward<_Tp>(__t)).*__f)(forward<_Args>(__args)...); } + noexcept(noexcept( + ((*std::forward<_Tp>(__t)).*__f)(std::forward<_Args>(__args)...))) + { + return ((*std::forward<_Tp>(__t)).*__f)(std::forward<_Args>(__args)...); + } template<typename _Res, typename _MemFun, typename _Tp, typename... _Args> inline _Res @@ -241,8 +245,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION inline _Res __invoke_impl(__invoke_memobj_deref, _MemFun&& __f, _Tp&& __t, _Args&&... __args) - noexcept(noexcept((*forward<_Tp>(__t)).*__f)) - { return (*forward<_Tp>(__t)).*__f; } + noexcept(noexcept((*std::forward<_Tp>(__t)).*__f)) + { return (*std::forward<_Tp>(__t)).*__f; } /// Invoke a callable object. template<typename _Callable, typename... _Args> @@ -603,8 +607,9 @@ _GLIBCXX_MEM_FN_TRAITS(&&, false_type, true_type) template<typename... _Args> auto operator()(_Args&&... __args) const - noexcept(noexcept(std::__invoke(_M_pmf, forward<_Args>(__args)...))) - -> decltype(std::__invoke(_M_pmf, forward<_Args>(__args)...)) + noexcept(noexcept( + std::__invoke(_M_pmf, std::forward<_Args>(__args)...))) + -> decltype(std::__invoke(_M_pmf, std::forward<_Args>(__args)...)) { return std::__invoke(_M_pmf, std::forward<_Args>(__args)...); } }; @@ -627,7 +632,7 @@ _GLIBCXX_MEM_FN_TRAITS(&&, false_type, true_type) template<typename _Tp> auto operator()(_Tp&& __obj) const - noexcept(noexcept(std::__invoke(_M_pm, forward<_Tp>(__obj)))) + noexcept(noexcept(std::__invoke(_M_pm, std::forward<_Tp>(__obj)))) -> decltype(std::__invoke(_M_pm, std::forward<_Tp>(__obj))) { return std::__invoke(_M_pm, std::forward<_Tp>(__obj)); } }; diff --git a/libstdc++-v3/testsuite/20_util/function_objects/mem_fn/68276.cc b/libstdc++-v3/testsuite/20_util/function_objects/mem_fn/68276.cc new file mode 100644 index 0000000..9341bab --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/function_objects/mem_fn/68276.cc @@ -0,0 +1,45 @@ +// Copyright (C) 2015 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-options "-std=gnu++11" } +// { dg-do compile } + +#include <functional> + +namespace n +{ + template<typename T> struct identity { using type = T; }; + + template<typename T> + T&& + forward(typename identity<T>::type& t) + { return static_cast<T&&>(t); } + + struct X { }; +} + +struct server +{ + void action(n::X) { } + + void act() { + auto f = std::mem_fn(&server::action); + n::X x; + f(this, x); + } +}; + |