From: Jonathan Wakely Date: Mon, 21 Dec 2015 13:02:12 +0000 (+0000) Subject: libstdc++/68276 consistently qualify std::forward X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e9e6a995380186401dd75b2dfb4331e2c85e9e25;p=gcc.git 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 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 1a79ff8212e..8ea45384462 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2015-12-21 Jonathan Wakely + + 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 PR libstdc++/66693 diff --git a/libstdc++-v3/include/std/functional b/libstdc++-v3/include/std/functional index ff29a57d850..4d08e12de43 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 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 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 @@ -603,8 +607,9 @@ _GLIBCXX_MEM_FN_TRAITS(&&, false_type, true_type) template 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 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 00000000000..9341bab6d58 --- /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 +// . + +// { dg-options "-std=gnu++11" } +// { dg-do compile } + +#include + +namespace n +{ + template struct identity { using type = T; }; + + template + T&& + forward(typename identity::type& t) + { return static_cast(t); } + + struct X { }; +} + +struct server +{ + void action(n::X) { } + + void act() { + auto f = std::mem_fn(&server::action); + n::X x; + f(this, x); + } +}; +