Commit 18407bfb by Jonathan Wakely Committed by Jonathan Wakely

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
parent 4c07fd98
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() ...@@ -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() ...@@ -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 ();
} }
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, ...@@ -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;
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment