From 60a1663f2267932e70665209910ddcec77a13bc3 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Sat, 6 Aug 2016 13:21:42 +0100 Subject: [PATCH] Fix construction of std::function from null pointer-to-member PR libstdc++/69293 * include/std/functional (_Function_base::_M_not_empty_function): Change overloads for pointers to take arguments by value. * testsuite/20_util/function/cons/57465.cc: Add tests for pointer-to-member cases. From-SVN: r239205 --- libstdc++-v3/ChangeLog | 9 +++++++ libstdc++-v3/include/std/functional | 8 +++---- .../testsuite/20_util/function/cons/57465.cc | 24 +++++++++++++++---- 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 4460748b28b9..ae8c9b9f7afe 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,14 @@ 2016-08-06 Jonathan Wakely + Backport from mainline + 2016-01-18 Jonathan Wakely + + PR libstdc++/69243 + * include/std/functional (_Function_base::_M_not_empty_function): + Change overloads for pointers to take arguments by value. + * testsuite/20_util/function/cons/57465.cc: Add tests for + pointer-to-member cases. + * doc/xml/manual/status_cxx2011.xml: Change "mainline GCC SVN" to refer to the release series. * doc/xml/manual/status_cxx2014.xml: Likewise. diff --git a/libstdc++-v3/include/std/functional b/libstdc++-v3/include/std/functional index cc40e4d8ec40..78f7073e8f7c 100644 --- a/libstdc++-v3/include/std/functional +++ b/libstdc++-v3/include/std/functional @@ -1764,13 +1764,13 @@ _GLIBCXX_MEM_FN_TRAITS(&&, false_type, true_type) template static bool - _M_not_empty_function(_Tp* const& __fp) - { return __fp; } + _M_not_empty_function(_Tp* __fp) + { return __fp != nullptr; } template static bool - _M_not_empty_function(_Tp _Class::* const& __mp) - { return __mp; } + _M_not_empty_function(_Tp _Class::* __mp) + { return __mp != nullptr; } template static bool diff --git a/libstdc++-v3/testsuite/20_util/function/cons/57465.cc b/libstdc++-v3/testsuite/20_util/function/cons/57465.cc index ba04ed6ac2b0..eb5556e4d46a 100644 --- a/libstdc++-v3/testsuite/20_util/function/cons/57465.cc +++ b/libstdc++-v3/testsuite/20_util/function/cons/57465.cc @@ -15,17 +15,33 @@ // with this library; see the file COPYING3. If not see // . -// libstdc++/57465 - // { dg-options "-std=gnu++11" } #include #include -int main() +void test01() { using F = void(); F* f = nullptr; std::function x(f); - VERIFY( !x ); + VERIFY( !x ); // libstdc++/57465 +} + +void test02() +{ + struct X { }; + int (X::*mf)() = nullptr; + std::function f = mf; + VERIFY( !f ); // libstdc++/69243 + + int X::*mp = nullptr; + f = mp; + VERIFY( !f ); +} + +int main() +{ + test01(); + test02(); } -- 2.47.2