From: Jonathan Wakely Date: Wed, 20 Jul 2016 18:21:48 +0000 (+0100) Subject: Use static pointer to member when catching nullptr X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=18407bfb2c2a34648ac7a1a8ebaa9a72a04126c6;p=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 --- diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ef0270ed6e1..1fbf173ff46 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-07-20 Jonathan Wakely + + * 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 * gcc.target/s390/pr67443.c: Fix test case. diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr35.C b/gcc/testsuite/g++.dg/cpp0x/nullptr35.C index c84966f24fe..d9321145e9a 100644 --- a/gcc/testsuite/g++.dg/cpp0x/nullptr35.C +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr35.C @@ -39,7 +39,7 @@ int main() caught(4); throw; } - } catch (int (A::*pmf)()) { // FIXME: currently unsupported + } catch (int (A::*pmf)()) { if (pmf == nullptr) caught(8); throw; @@ -47,6 +47,35 @@ int main() } 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 (); } diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index e2bab6330ac..40caba12448 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,8 @@ +2016-07-20 Jonathan Wakely + + * 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 Clean up optional's comments. diff --git a/libstdc++-v3/libsupc++/pbase_type_info.cc b/libstdc++-v3/libsupc++/pbase_type_info.cc index a2993e431fe..ff6b756519b 100644 --- a/libstdc++-v3/libsupc++/pbase_type_info.cc +++ b/libstdc++-v3/libsupc++/pbase_type_info.cc @@ -50,14 +50,16 @@ __do_catch (const type_info *thr_type, { if (__pointee->__is_function_p ()) { - // A pointer-to-member-function is two words but the - // nullptr_t exception object at *(nullptr_t*)*thr_obj is only - // one word, so we can't safely return it as a PMF. FIXME. - return false; + using pmf_type = void (__pbase_type_info::*)(); + static const pmf_type pmf = nullptr; + *thr_obj = const_cast(&pmf); + return true; } 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); return true; } }