mirror of git://gcc.gnu.org/git/gcc.git
Use static pointer to member when catching nullptr
libstdc++-v3: * libsupc++/pbase_type_info.cc (__pbase_type_info::__do_catch): Use static objects for catching nullptr as pointer to member types. gcc/testsuite: * g++.dg/cpp0x/nullptr35.C: Change expected result for catching as pointer to member function and also test catching by reference. From-SVN: r238532
This commit is contained in:
parent
4c07fd98b8
commit
18407bfb2c
|
|
@ -1,3 +1,8 @@
|
||||||
|
2016-07-20 Jonathan Wakely <jwakely@redhat.com>
|
||||||
|
|
||||||
|
* g++.dg/cpp0x/nullptr35.C: Change expected result for catching as
|
||||||
|
pointer to member function and also test catching by reference.
|
||||||
|
|
||||||
2016-07-20 Dominik Vogt <vogt@linux.vnet.ibm.com>
|
2016-07-20 Dominik Vogt <vogt@linux.vnet.ibm.com>
|
||||||
|
|
||||||
* gcc.target/s390/pr67443.c: Fix test case.
|
* gcc.target/s390/pr67443.c: Fix test case.
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@ int main()
|
||||||
caught(4);
|
caught(4);
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
} catch (int (A::*pmf)()) { // FIXME: currently unsupported
|
} catch (int (A::*pmf)()) {
|
||||||
if (pmf == nullptr)
|
if (pmf == nullptr)
|
||||||
caught(8);
|
caught(8);
|
||||||
throw;
|
throw;
|
||||||
|
|
@ -47,6 +47,35 @@ int main()
|
||||||
} catch (nullptr_t) {
|
} catch (nullptr_t) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result != 7) // should be 15
|
try {
|
||||||
|
try {
|
||||||
|
try {
|
||||||
|
try {
|
||||||
|
try {
|
||||||
|
throw nullptr;
|
||||||
|
} catch (void* const& p) {
|
||||||
|
if (p == nullptr)
|
||||||
|
caught(16);
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
} catch (void(* const& pf)()) {
|
||||||
|
if (pf == nullptr)
|
||||||
|
caught(32);
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
} catch (int A::* const& pm) {
|
||||||
|
if (pm == nullptr)
|
||||||
|
caught(64);
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
} catch (int (A::* const& pmf)()) {
|
||||||
|
if (pmf == nullptr)
|
||||||
|
caught(128);
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
} catch (nullptr_t) {
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result != 255)
|
||||||
abort ();
|
abort ();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,8 @@
|
||||||
|
2016-07-20 Jonathan Wakely <jwakely@redhat.com>
|
||||||
|
|
||||||
|
* libsupc++/pbase_type_info.cc (__pbase_type_info::__do_catch): Use
|
||||||
|
static objects for catching nullptr as pointer to member types.
|
||||||
|
|
||||||
2016-07-18 Ville Voutilainen <ville.voutilainen@gmail.com>
|
2016-07-18 Ville Voutilainen <ville.voutilainen@gmail.com>
|
||||||
|
|
||||||
Clean up optional's comments.
|
Clean up optional's comments.
|
||||||
|
|
|
||||||
|
|
@ -50,14 +50,16 @@ __do_catch (const type_info *thr_type,
|
||||||
{
|
{
|
||||||
if (__pointee->__is_function_p ())
|
if (__pointee->__is_function_p ())
|
||||||
{
|
{
|
||||||
// A pointer-to-member-function is two words <ptr,adj> but the
|
using pmf_type = void (__pbase_type_info::*)();
|
||||||
// nullptr_t exception object at *(nullptr_t*)*thr_obj is only
|
static const pmf_type pmf = nullptr;
|
||||||
// one word, so we can't safely return it as a PMF. FIXME.
|
*thr_obj = const_cast<pmf_type*>(&pmf);
|
||||||
return false;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*(ptrdiff_t*)*thr_obj = -1; // null pointer to data member
|
using pm_type = int __pbase_type_info::*;
|
||||||
|
static const pm_type pm = nullptr;
|
||||||
|
*thr_obj = const_cast<pm_type*>(&pm);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue