]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix construction of std::function from null pointer-to-member
authorJonathan Wakely <jwakely@redhat.com>
Sat, 6 Aug 2016 12:21:42 +0000 (13:21 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Sat, 6 Aug 2016 12:21:42 +0000 (13:21 +0100)
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
libstdc++-v3/include/std/functional
libstdc++-v3/testsuite/20_util/function/cons/57465.cc

index 4460748b28b971c408ad66f77bea8d4bb3a14af2..ae8c9b9f7afe2a5e6acae2d96aa6b1c4a8fb8038 100644 (file)
@@ -1,5 +1,14 @@
 2016-08-06  Jonathan Wakely  <jwakely@redhat.com>
 
+       Backport from mainline
+       2016-01-18  Jonathan Wakely  <jwakely@redhat.com>
+
+       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.
index cc40e4d8ec40bb979546cc4da01707448e278dba..78f7073e8f7ccf5d857f7ab401cca9bece475e85 100644 (file)
@@ -1764,13 +1764,13 @@ _GLIBCXX_MEM_FN_TRAITS(&&, false_type, true_type)
 
        template<typename _Tp>
          static bool
-         _M_not_empty_function(_Tp* const& __fp)
-         { return __fp; }
+         _M_not_empty_function(_Tp* __fp)
+         { return __fp != nullptr; }
 
        template<typename _Class, typename _Tp>
          static bool
-         _M_not_empty_function(_Tp _Class::* const& __mp)
-         { return __mp; }
+         _M_not_empty_function(_Tp _Class::* __mp)
+         { return __mp != nullptr; }
 
        template<typename _Tp>
          static bool
index ba04ed6ac2b0c01641d642a3ef8971a4e8618ecb..eb5556e4d46aa76264a5fa160a751fa4dfeec49a 100644 (file)
 // with this library; see the file COPYING3.  If not see
 // <http://www.gnu.org/licenses/>.
 
-// libstdc++/57465
-
 // { dg-options "-std=gnu++11" }
 
 #include <functional>
 #include <testsuite_hooks.h>
 
-int main()
+void test01()
 {
   using F = void();
   F* f = nullptr;
   std::function<F> x(f);
-  VERIFY( !x );
+  VERIFY( !x ); // libstdc++/57465
+}
+
+void test02()
+{
+  struct X { };
+  int (X::*mf)() = nullptr;
+  std::function<int(X&)> f = mf;
+  VERIFY( !f ); // libstdc++/69243
+
+  int X::*mp = nullptr;
+  f = mp;
+  VERIFY( !f );
+}
+
+int main()
+{
+  test01();
+  test02();
 }