Core DR 475 PR c++/41174 PR c++/59224

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
This commit is contained in:
Jason Merrill 2014-01-27 08:57:39 -05:00 committed by Jason Merrill
parent c6f6157a45
commit ccc2e73ce7
5 changed files with 42 additions and 13 deletions

View File

@ -13,7 +13,7 @@ struct Check {
static Check const data[] = { static Check const data[] = {
{ 0, 0, false }, // construct [0] { 0, 0, false }, // construct [0]
{ 1, 0, true }, // [1] = [0] { 1, 0, false }, // [1] = [0]
{ 0, 0, true }, // destruct [0] { 0, 0, true }, // destruct [0]
{ 2, 1, true }, // [2] = [1] { 2, 1, true }, // [2] = [1]
{ 2, 2, true }, // destruct [2] { 2, 2, true }, // destruct [2]

View File

@ -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() );
}

View 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> 2014-01-26 Jonathan Wakely <jwakely@redhat.com>
* include/bits/stl_map.h: Remove anachronistic comment. * include/bits/stl_map.h: Remove anachronistic comment.

View File

@ -129,12 +129,6 @@ __cxxabiv1::__cxa_allocate_exception(std::size_t thrown_size) _GLIBCXX_NOTHROW
std::terminate (); 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)); memset (ret, 0, sizeof (__cxa_refcounted_exception));
return (void *)((char *)ret + 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 (); 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)); memset (ret, 0, sizeof (__cxa_dependent_exception));
return ret; return ret;

View File

@ -62,6 +62,9 @@ __cxxabiv1::__cxa_throw (void *obj, std::type_info *tinfo,
{ {
PROBE2 (throw, obj, tinfo); PROBE2 (throw, obj, tinfo);
__cxa_eh_globals *globals = __cxa_get_globals ();
globals->uncaughtExceptions += 1;
// Definitely a primary. // Definitely a primary.
__cxa_refcounted_exception *header __cxa_refcounted_exception *header
= __get_refcounted_exception_header_from_obj (obj); = __get_refcounted_exception_header_from_obj (obj);