Another case of problems caused by incorrect use of result_of. Because functions can't have top-level const on parameters result_of<F(const T)> is result_of<F(T)> so doesn't give you the answer for the question you meant to ask.
PR libstdc++/79798 * include/std/functional (bind::_Res_type_impl): Fix incorrect use of result_of that loses top-level cv-qualifiers. * testsuite/20_util/bind/79798.cc: New test. Tested powerpc64le-linux, committed to trunk.
commit d2d652a7e40288a89259bae17eddec9cde0e177c Author: Jonathan Wakely <jwak...@redhat.com> Date: Thu Mar 2 01:33:10 2017 +0000 PR 79798 Fix incorrect use of std::result_of in std::bind PR libstdc++/79798 * include/std/functional (bind::_Res_type_impl): Fix incorrect use of result_of that loses top-level cv-qualifiers. * testsuite/20_util/bind/79798.cc: New test. diff --git a/libstdc++-v3/include/std/functional b/libstdc++-v3/include/std/functional index 4f3d8b3..ea36dd0 100644 --- a/libstdc++-v3/include/std/functional +++ b/libstdc++-v3/include/std/functional @@ -502,7 +502,7 @@ _GLIBCXX_MEM_FN_TRAITS(&&, false_type, true_type) template<typename _Fn, typename _CallArgs, typename... _BArgs> using _Res_type_impl - = typename result_of< _Fn&(_Mu_type<_BArgs, _CallArgs>...) >::type; + = typename result_of< _Fn&(_Mu_type<_BArgs, _CallArgs>&&...) >::type; template<typename _CallArgs> using _Res_type = _Res_type_impl<_Functor, _CallArgs, _Bound_args...>; diff --git a/libstdc++-v3/testsuite/20_util/bind/79798.cc b/libstdc++-v3/testsuite/20_util/bind/79798.cc new file mode 100644 index 0000000..9780ff4 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/bind/79798.cc @@ -0,0 +1,33 @@ +// Copyright (C) 2017 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> + +// PR libstdc++/79798 + +struct X { }; +const X f(int); + +struct Y { + void operator()(X&&) = delete; + int operator()(const X&&); +}; + +auto b = std::bind(Y(), std::bind(f, std::placeholders::_1)); +auto i = b(1);