aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2016-07-20 19:21:48 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2016-07-20 19:21:48 +0100
commit18407bfb2c2a34648ac7a1a8ebaa9a72a04126c6 (patch)
treec098d81960006323e6c0be48ab05026e6e2544ec
parent4c07fd98b80242f8d4fd30e6264150826c21cee6 (diff)
downloadgcc-18407bfb2c2a34648ac7a1a8ebaa9a72a04126c6.zip
gcc-18407bfb2c2a34648ac7a1a8ebaa9a72a04126c6.tar.gz
gcc-18407bfb2c2a34648ac7a1a8ebaa9a72a04126c6.tar.bz2
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
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/nullptr35.C33
-rw-r--r--libstdc++-v3/ChangeLog5
-rw-r--r--libstdc++-v3/libsupc++/pbase_type_info.cc12
4 files changed, 48 insertions, 7 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ef0270e..1fbf173 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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>
* 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 c84966f..d932114 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 e2bab63..40caba1 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -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>
Clean up optional's comments.
diff --git a/libstdc++-v3/libsupc++/pbase_type_info.cc b/libstdc++-v3/libsupc++/pbase_type_info.cc
index a2993e4..ff6b756 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 <ptr,adj> 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_type*>(&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_type*>(&pm);
return true;
}
}