Core DR 475 PR c++/41174 PR c++/59224
authorJason Merrill <jason@redhat.com>
Mon, 27 Jan 2014 13:57:39 +0000 (08:57 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 27 Jan 2014 13:57:39 +0000 (08:57 -0500)
Core DR 475
PR c++/41174
PR c++/59224
* libsupc++/eh_throw.cc (__cxa_throw): Set uncaughtExceptions.
* libsupc++/eh_alloc.cc (__cxa_allocate_dependent_exception)
(__cxa_allocate_exception): Don't set it here.

From-SVN: r207129

gcc/testsuite/g++.dg/eh/uncaught1.C
gcc/testsuite/g++.dg/eh/uncaught4.C [new file with mode: 0644]
libstdc++-v3/ChangeLog
libstdc++-v3/libsupc++/eh_alloc.cc
libstdc++-v3/libsupc++/eh_throw.cc

index afbf5af..e96af33 100644 (file)
@@ -13,7 +13,7 @@ struct Check {
 
 static Check const data[] = {
   { 0, 0, false },     // construct [0]
-  { 1, 0, true  },     // [1] = [0]
+  { 1, 0, false  },    // [1] = [0]
   { 0, 0, true  },     // destruct [0]
   { 2, 1, true  },     // [2] = [1]
   { 2, 2, true  },      // destruct [2]
diff --git a/gcc/testsuite/g++.dg/eh/uncaught4.C b/gcc/testsuite/g++.dg/eh/uncaught4.C
new file mode 100644 (file)
index 0000000..227d11b
--- /dev/null
@@ -0,0 +1,29 @@
+// PR c++/41174
+// { dg-do run }
+
+#include <exception>
+
+#define assert(E) if (!(E)) __builtin_abort();
+
+struct e {
+  e()
+  {
+    assert( !std::uncaught_exception() );
+    try {
+      throw 1;
+    } catch (int i) {
+      assert( !std::uncaught_exception() );
+      throw;
+    }
+  }
+};
+
+int main()
+{
+  try {
+    throw e();
+  } catch (int i) {
+    assert( !std::uncaught_exception() );
+  }
+  assert( !std::uncaught_exception() );
+}
index 02f0af9..18012cb 100644 (file)
@@ -1,3 +1,12 @@
+2014-01-27  Jason Merrill  <jason@redhat.com>
+
+       Core DR 475
+       PR c++/41174
+       PR c++/59224
+       * libsupc++/eh_throw.cc (__cxa_throw): Set uncaughtExceptions.
+       * libsupc++/eh_alloc.cc (__cxa_allocate_dependent_exception)
+       (__cxa_allocate_exception): Don't set it here.
+
 2014-01-26  Jonathan Wakely  <jwakely@redhat.com>
 
        * include/bits/stl_map.h: Remove anachronistic comment.
index 01eed97..752f5db 100644 (file)
@@ -129,12 +129,6 @@ __cxxabiv1::__cxa_allocate_exception(std::size_t thrown_size) _GLIBCXX_NOTHROW
        std::terminate ();
     }
 
-  // We have an uncaught exception as soon as we allocate memory.  This
-  // yields uncaught_exception() true during the copy-constructor that
-  // initializes the exception object.  See Issue 475.
-  __cxa_eh_globals *globals = __cxa_get_globals ();
-  globals->uncaughtExceptions += 1;
-
   memset (ret, 0, sizeof (__cxa_refcounted_exception));
 
   return (void *)((char *)ret + sizeof (__cxa_refcounted_exception));
@@ -191,12 +185,6 @@ __cxxabiv1::__cxa_allocate_dependent_exception() _GLIBCXX_NOTHROW
        std::terminate ();
     }
 
-  // We have an uncaught exception as soon as we allocate memory.  This
-  // yields uncaught_exception() true during the copy-constructor that
-  // initializes the exception object.  See Issue 475.
-  __cxa_eh_globals *globals = __cxa_get_globals ();
-  globals->uncaughtExceptions += 1;
-
   memset (ret, 0, sizeof (__cxa_dependent_exception));
 
   return ret;
index ffd28d8..e9a34e2 100644 (file)
@@ -62,6 +62,9 @@ __cxxabiv1::__cxa_throw (void *obj, std::type_info *tinfo,
 {
   PROBE2 (throw, obj, tinfo);
 
+  __cxa_eh_globals *globals = __cxa_get_globals ();
+  globals->uncaughtExceptions += 1;
+
   // Definitely a primary.
   __cxa_refcounted_exception *header
     = __get_refcounted_exception_header_from_obj (obj);