+2016-07-15 Jonathan Wakely <jwakely@redhat.com>
+
+ PR c++/58796
+ * g++.dg/cpp0x/nullptr21.C: Remove void* handlers.
+ * g++.dg/cpp0x/nullptr35.C: New test.
+
2016-07-15 Bin Cheng <bin.cheng@arm.com>
* gcc.dg/tree-ssa/scev-8.c: Update test string.
{
try {
throw nullptr;
- } catch (void*) {
- foo (0, 1);
} catch (bool) {
foo (0, 2);
} catch (int) {
nullptr_t mynull = 0;
try {
throw mynull;
- } catch (void*) {
- foo (1, 1);
} catch (bool) {
foo (1, 2);
} catch (int) {
--- /dev/null
+// { dg-do run { target c++11 } }
+
+// Test catching as pointer and pointer to member types, [except.handle] p3.
+
+extern "C" void abort (void);
+
+typedef decltype(nullptr) nullptr_t;
+
+int result = 0;
+
+void __attribute__((noinline))
+caught(int bit)
+{
+ result &= bit;
+}
+
+struct A { };
+
+int main()
+{
+ try {
+ try {
+ try {
+ try {
+ try {
+ throw nullptr;
+ } catch (void* p) {
+ if (p == nullptr)
+ caught(1);
+ throw;
+ }
+ } catch (void(*pf)()) {
+ if (pf == nullptr)
+ caught(2);
+ throw;
+ }
+ } catch (int A::*pm) {
+ if (pm == nullptr)
+ caught(4);
+ throw;
+ }
+ } catch (int (A::*pmf)()) { // FIXME: currently unsupported
+ if (pmf == nullptr)
+ caught(8);
+ throw;
+ }
+ } catch (nullptr_t) {
+ }
+
+ if (result != 7) // should be 15
+ abort ();
+}
+2016-07-15 Jonathan Wakely <jwakely@redhat.com>
+
+ PR c++/58796
+ * libsupc++/pbase_type_info.cc (__pbase_type_info::__do_catch): Make
+ nullptr match handlers of pointer type.
+
2016-07-15 Edward Smith-Rowland <3dw4rd@verizon.net>
Implement C++17 P0025 clamp.
return true; // same type
#if __cpp_rtti
+ if (*thr_type == typeid (nullptr))
+ {
+ // A catch handler for any pointer type matches nullptr_t.
+ if (typeid (*this) == typeid(__pointer_type_info))
+ {
+ *thr_obj = nullptr;
+ return true;
+ }
+ else if (typeid (*this) == typeid(__pointer_to_member_type_info))
+ {
+ 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;
+ }
+ else
+ {
+ *(ptrdiff_t*)*thr_obj = -1; // null pointer to data member
+ return true;
+ }
+ }
+ }
+
if (typeid (*this) != typeid (*thr_type))
return false; // not both same kind of pointers
#endif