commit c818a106076c2d1adac2c9d6ba10d0778daee591 Author: Jonathan Wakely Date: Mon Dec 21 01:15:13 2015 +0000 libstdc++/68995 qualify calls to __callable_functor PR libstdc++/68995 * include/std/functional (_function_handler, function): Qualify __callable_functor. * testsuite/20_util/function/68995.cc: New. diff --git a/libstdc++-v3/include/std/functional b/libstdc++-v3/include/std/functional index 4d08e12..b994df4 100644 --- a/libstdc++-v3/include/std/functional +++ b/libstdc++-v3/include/std/functional @@ -1752,7 +1752,7 @@ _GLIBCXX_MEM_FN_TRAITS(&&, false_type, true_type) static _Res _M_invoke(const _Any_data& __functor, _ArgTypes&&... __args) { - return __callable_functor(**_Base::_M_get_pointer(__functor))( + return std::__callable_functor(**_Base::_M_get_pointer(__functor))( std::forward<_ArgTypes>(__args)...); } }; @@ -1767,7 +1767,7 @@ _GLIBCXX_MEM_FN_TRAITS(&&, false_type, true_type) static void _M_invoke(const _Any_data& __functor, _ArgTypes&&... __args) { - __callable_functor(**_Base::_M_get_pointer(__functor))( + std::__callable_functor(**_Base::_M_get_pointer(__functor))( std::forward<_ArgTypes>(__args)...); } }; @@ -1847,8 +1847,9 @@ _GLIBCXX_MEM_FN_TRAITS(&&, false_type, true_type) typedef _Res _Signature_type(_ArgTypes...); template - using _Invoke = decltype(__callable_functor(std::declval<_Functor&>()) - (std::declval<_ArgTypes>()...) ); + using _Invoke + = decltype(std::__callable_functor(std::declval<_Functor&>()) + (std::declval<_ArgTypes>()...) ); // Used so the return type convertibility checks aren't done when // performing overload resolution for copy construction/assignment. diff --git a/libstdc++-v3/testsuite/20_util/function/68995.cc b/libstdc++-v3/testsuite/20_util/function/68995.cc new file mode 100644 index 0000000..42bd567 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/function/68995.cc @@ -0,0 +1,27 @@ +// 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 +#include +#include + +std::tr1::shared_ptr test() { return {}; } + +std::function()> func = test; commit 175f3331c91846942f2bbb1aa63527ffbb49b41b Author: Jonathan Wakely Date: Fri Dec 18 18:27:28 2015 +0000 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. 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 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 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 +// . + +// { 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); + } +}; +