Index: test/catch_ptr_02.cpp =================================================================== --- test/catch_ptr_02.cpp +++ test/catch_ptr_02.cpp @@ -135,9 +135,10 @@ void test8 () { + vDerived derived; try { - throw new vDerived; + throw &derived; assert(false); } catch (vBase *p) { Index: test/inherited_exception.cpp =================================================================== --- test/inherited_exception.cpp +++ test/inherited_exception.cpp @@ -56,11 +56,11 @@ } void f3() { - Child* child = new Child; - child->b1 = 10; - child->b2 = 11; - child->c = 12; - throw static_cast(child); + static Child child; + child.b1 = 10; + child.b2 = 11; + child.c = 12; + throw static_cast(&child); } int main() Index: test/test_vector1.cpp =================================================================== --- test/test_vector1.cpp +++ test/test_vector1.cpp @@ -11,6 +11,7 @@ #include #include +#include // Wrapper routines void *my_alloc2 ( size_t sz ) { @@ -206,31 +207,32 @@ int test_exception_in_destructor ( ) { int retVal = 0; void *one, *two, *three; + one = two = three = NULL; // Throw from within a destructor gConstructorCounter = gDestructorCounter = 0; gConstructorThrowTarget = -1; gDestructorThrowTarget = 15; try { - one = two = three = NULL; + one = two = NULL; one = __cxxabiv1::__cxa_vec_new ( 10, 40, 8, throw_construct, throw_destruct ); two = __cxxabiv1::__cxa_vec_new2( 10, 40, 8, throw_construct, throw_destruct, my_alloc2, my_dealloc2 ); - three = __cxxabiv1::__cxa_vec_new3( 10, 40, 8, throw_construct, throw_destruct, my_alloc2, my_dealloc3 ); } catch ( int i ) {} try { __cxxabiv1::__cxa_vec_delete ( one, 40, 8, throw_destruct ); __cxxabiv1::__cxa_vec_delete2( two, 40, 8, throw_destruct, my_dealloc2 ); - __cxxabiv1::__cxa_vec_delete3( three, 40, 8, throw_destruct, my_dealloc3 ); + assert(false); } catch ( int i ) {} // We should have thrown in the middle of cleaning up "two", which means that -// there should be 20 calls to the destructor, and "three" was not cleaned up. - if ( gConstructorCounter != 30 || gDestructorCounter != 20 ) { +// there should be 20 calls to the destructor and the try block should exit +// before the assertion. + if ( gConstructorCounter != 20 || gDestructorCounter != 20 ) { std::cerr << "Unexpected Constructor/Destructor calls (1D)" << std::endl; - std::cerr << "Expected (30, 20), but got (" << gConstructorCounter << ", " << + std::cerr << "Expected (20, 20), but got (" << gConstructorCounter << ", " << gDestructorCounter << ")" << std::endl; retVal = 1; }