raven-rhel6/gcc44/gcc44-pr59224.patch
2024-02-21 20:14:44 +06:00

93 lines
2.6 KiB
Diff

2014-04-01 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.
--- libstdc++-v3/libsupc++/eh_alloc.cc (revision 208990)
+++ libstdc++-v3/libsupc++/eh_alloc.cc (revision 208991)
@@ -126,12 +126,6 @@
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));
@@ -188,12 +182,6 @@
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;
--- libstdc++-v3/libsupc++/eh_throw.cc (revision 208990)
+++ libstdc++-v3/libsupc++/eh_throw.cc (revision 208991)
@@ -61,6 +61,9 @@
__cxxabiv1::__cxa_throw (void *obj, std::type_info *tinfo,
void (*dest) (void *))
{
+ __cxa_eh_globals *globals = __cxa_get_globals ();
+ globals->uncaughtExceptions += 1;
+
// Definitely a primary.
__cxa_refcounted_exception *header
= __get_refcounted_exception_header_from_obj (obj);
--- gcc/testsuite/g++.dg/eh/uncaught1.C (revision 208990)
+++ gcc/testsuite/g++.dg/eh/uncaught1.C (revision 208991)
@@ -13,7 +13,7 @@
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]
--- gcc/testsuite/g++.dg/eh/uncaught4.C (revision 0)
+++ gcc/testsuite/g++.dg/eh/uncaught4.C (revision 208991)
@@ -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() );
+}