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:
parent
9a1bdc314b
commit
9c5ad80efd
3 changed files with 30 additions and 8 deletions
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue