From 5782e3094161376c1679c2e5099445b09cf2bf75 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Thu, 2 Mar 2017 03:43:36 +0000 Subject: [PATCH] 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. From-SVN: r245827 --- libstdc++-v3/ChangeLog | 7 +++++ libstdc++-v3/include/std/functional | 2 +- libstdc++-v3/testsuite/20_util/bind/79798.cc | 33 ++++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 libstdc++-v3/testsuite/20_util/bind/79798.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index c7e277ae99d..537d9d7a1c0 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2017-03-02 Jonathan Wakely + + 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. + 2017-03-01 Gerald Pfeifer * doc/xml/manual/documentation_hacking.xml: Tweak link to diff --git a/libstdc++-v3/include/std/functional b/libstdc++-v3/include/std/functional index 4f3d8b356e7..ea36dd01c21 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 using _Res_type_impl - = typename result_of< _Fn&(_Mu_type<_BArgs, _CallArgs>...) >::type; + = typename result_of< _Fn&(_Mu_type<_BArgs, _CallArgs>&&...) >::type; template 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 00000000000..9780ff48ac9 --- /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 +// . + +// { dg-do compile { target c++11 } } + +#include + +// 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); -- 2.30.2