aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2016-01-18 11:43:37 +0000
committerJonathan Wakely <redi@gcc.gnu.org>2016-01-18 11:43:37 +0000
commit9c5ad80efd80e3962bb7e09bc3ab73545f56d549 (patch)
tree47166d36c8198f6504c1f427a9a59226a5709ca2
parent9a1bdc314ba086904861838838bc2e0743476dcd (diff)
downloadgcc-9c5ad80efd80e3962bb7e09bc3ab73545f56d549.zip
gcc-9c5ad80efd80e3962bb7e09bc3ab73545f56d549.tar.gz
gcc-9c5ad80efd80e3962bb7e09bc3ab73545f56d549.tar.bz2
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: r232504
-rw-r--r--libstdc++-v3/ChangeLog6
-rw-r--r--libstdc++-v3/include/std/functional8
-rw-r--r--libstdc++-v3/testsuite/20_util/function/cons/57465.cc24
3 files changed, 30 insertions, 8 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 74ef4f6..787bcd7 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,5 +1,11 @@
2016-01-18 Jonathan Wakely <jwakely@redhat.com>
+ 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.
+
PR libstdc++/69340
* src/c++11/cow-stdexcept.cc (_txnal_cow_string_C1_for_exceptions):
Use macros for exception handling and fix unused parameter warning.
diff --git a/libstdc++-v3/include/std/functional b/libstdc++-v3/include/std/functional
index 557156a..9799410 100644
--- a/libstdc++-v3/include/std/functional
+++ b/libstdc++-v3/include/std/functional
@@ -1633,13 +1633,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
diff --git a/libstdc++-v3/testsuite/20_util/function/cons/57465.cc b/libstdc++-v3/testsuite/20_util/function/cons/57465.cc
index be2d132..7b13d4b 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
// <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();
}