#include "cxxabi.h"
#include <cassert>
#include <cstdlib>
#include <exception>
void my_terminate () { exit ( 0 ); }
void *my_alloc2 ( size_t sz ) {
void *p = std::malloc ( sz );
return p;
}
void my_dealloc2 ( void *p ) {
std::free ( p );
}
void my_dealloc3 ( void *p, size_t ) {
std::free ( p );
}
void my_construct ( void *) {
}
void my_destruct ( void *) {
}
int gCounter;
void count_construct ( void * ) { ++gCounter; }
void count_destruct ( void * ) { --gCounter; }
int gConstructorCounter;
int gConstructorThrowTarget;
int gDestructorCounter;
int gDestructorThrowTarget;
void throw_construct ( void * ) { if ( gConstructorCounter == gConstructorThrowTarget ) throw 1; ++gConstructorCounter; }
void throw_destruct ( void * ) { if ( ++gDestructorCounter == gDestructorThrowTarget ) throw 2; }
struct vec_on_stack {
void *storage;
vec_on_stack () : storage ( __cxxabiv1::__cxa_vec_new ( 10, 40, 8, throw_construct, throw_destruct )) {}
~vec_on_stack () { __cxxabiv1::__cxa_vec_delete ( storage, 40, 8, throw_destruct ); }
};
void test_exception_in_destructor ( ) {
gConstructorCounter = gDestructorCounter = 0;
gConstructorThrowTarget = -1;
gDestructorThrowTarget = 5;
try {
vec_on_stack v;
throw 3;
} catch ( int i ) {
}
assert(false && "should never get here");
}
int main () {
std::set_terminate ( my_terminate );
test_exception_in_destructor ();
return 1;
}