diff options
| author | Jonathan Roelofs <jonathan@codesourcery.com> | 2015-01-21 19:05:37 +0000 |
|---|---|---|
| committer | Jonathan Roelofs <jonathan@codesourcery.com> | 2015-01-21 19:05:37 +0000 |
| commit | e434b34fa342da0539581690334b105101d00155 (patch) | |
| tree | aac5c35a8c7931251e06f007af33d4182627b1f5 /libcxxabi/test/test_vector2.pass.cpp | |
| parent | 311730ac7834eb2d1283c86b6303e688343271bd (diff) | |
| download | bcm5719-llvm-e434b34fa342da0539581690334b105101d00155.tar.gz bcm5719-llvm-e434b34fa342da0539581690334b105101d00155.zip | |
Rename all of the tests in preparation for merging lit configs with libcxx
http://reviews.llvm.org/D7101
llvm-svn: 226691
Diffstat (limited to 'libcxxabi/test/test_vector2.pass.cpp')
| -rw-r--r-- | libcxxabi/test/test_vector2.pass.cpp | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/libcxxabi/test/test_vector2.pass.cpp b/libcxxabi/test/test_vector2.pass.cpp new file mode 100644 index 00000000000..1cb7d9c2707 --- /dev/null +++ b/libcxxabi/test/test_vector2.pass.cpp @@ -0,0 +1,83 @@ +//===--------------------------- test_vector2.cpp -------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "cxxabi.h" + +#include <iostream> +#include <cstdlib> + +void my_terminate () { exit ( 0 ); } + +// Wrapper routines +void *my_alloc2 ( size_t sz ) { + void *p = std::malloc ( sz ); +// std::printf ( "Allocated %ld bytes at %lx\n", sz, (unsigned long) p ); + return p; + } + +void my_dealloc2 ( void *p ) { +// std::printf ( "Freeing %lx\n", (unsigned long) p ); + std::free ( p ); + } + +void my_dealloc3 ( void *p, size_t sz ) { +// std::printf ( "Freeing %lx (size %ld)\n", (unsigned long) p, sz ); + std::free ( p ); + } + +void my_construct ( void *p ) { +// std::printf ( "Constructing %lx\n", (unsigned long) p ); + } + +void my_destruct ( void *p ) { +// std::printf ( "Destructing %lx\n", (unsigned long) p ); + } + +int gCounter; +void count_construct ( void *p ) { ++gCounter; } +void count_destruct ( void *p ) { --gCounter; } + + +int gConstructorCounter; +int gConstructorThrowTarget; +int gDestructorCounter; +int gDestructorThrowTarget; +void throw_construct ( void *p ) { if ( gConstructorCounter == gConstructorThrowTarget ) throw 1; ++gConstructorCounter; } +void throw_destruct ( void *p ) { 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 ); } + }; + + +// Make sure the constructors and destructors are matched +void test_exception_in_destructor ( ) { + +// Try throwing from a destructor while unwinding the stack -- should abort + gConstructorCounter = gDestructorCounter = 0; + gConstructorThrowTarget = -1; + gDestructorThrowTarget = 5; + try { + vec_on_stack v; + throw 3; + } + catch ( int i ) {} + + std::cerr << "should never get here" << std::endl; + } + + + +int main ( int argc, char *argv [] ) { + std::set_terminate ( my_terminate ); + test_exception_in_destructor (); + return 1; // we failed if we get here + } |

