diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2016-01-18 11:43:37 +0000 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2016-01-18 11:43:37 +0000 |
commit | 9c5ad80efd80e3962bb7e09bc3ab73545f56d549 (patch) | |
tree | 47166d36c8198f6504c1f427a9a59226a5709ca2 | |
parent | 9a1bdc314ba086904861838838bc2e0743476dcd (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | libstdc++-v3/include/std/functional | 8 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/20_util/function/cons/57465.cc | 24 |
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(); } |