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
This commit is contained in:
Jonathan Wakely 2016-01-18 11:43:37 +00:00 committed by Jonathan Wakely
parent 9a1bdc314b
commit 9c5ad80efd
3 changed files with 30 additions and 8 deletions

View file

@ -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.

View file

@ -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

View file

@ -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();
}