1*c05d8e5dSAndroid Build Coastguard Worker //===------------------------- test_vector3.cpp ---------------------------===// 2*c05d8e5dSAndroid Build Coastguard Worker // 3*c05d8e5dSAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*c05d8e5dSAndroid Build Coastguard Worker // 5*c05d8e5dSAndroid Build Coastguard Worker // This file is dual licensed under the MIT and the University of Illinois Open 6*c05d8e5dSAndroid Build Coastguard Worker // Source Licenses. See LICENSE.TXT for details. 7*c05d8e5dSAndroid Build Coastguard Worker // 8*c05d8e5dSAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*c05d8e5dSAndroid Build Coastguard Worker 10*c05d8e5dSAndroid Build Coastguard Worker // UNSUPPORTED: libcxxabi-no-exceptions 11*c05d8e5dSAndroid Build Coastguard Worker 12*c05d8e5dSAndroid Build Coastguard Worker #include "cxxabi.h" 13*c05d8e5dSAndroid Build Coastguard Worker 14*c05d8e5dSAndroid Build Coastguard Worker #include <stdio.h> 15*c05d8e5dSAndroid Build Coastguard Worker #include <stdlib.h> 16*c05d8e5dSAndroid Build Coastguard Worker #include <assert.h> 17*c05d8e5dSAndroid Build Coastguard Worker #include <exception> 18*c05d8e5dSAndroid Build Coastguard Worker 19*c05d8e5dSAndroid Build Coastguard Worker #include <memory> 20*c05d8e5dSAndroid Build Coastguard Worker 21*c05d8e5dSAndroid Build Coastguard Worker // use dtors instead of try/catch 22*c05d8e5dSAndroid Build Coastguard Worker namespace test1 { 23*c05d8e5dSAndroid Build Coastguard Worker struct B { ~Btest1::B24*c05d8e5dSAndroid Build Coastguard Worker ~B() { 25*c05d8e5dSAndroid Build Coastguard Worker printf("should not be run\n"); 26*c05d8e5dSAndroid Build Coastguard Worker exit(10); 27*c05d8e5dSAndroid Build Coastguard Worker } 28*c05d8e5dSAndroid Build Coastguard Worker }; 29*c05d8e5dSAndroid Build Coastguard Worker 30*c05d8e5dSAndroid Build Coastguard Worker struct A { ~Atest1::A31*c05d8e5dSAndroid Build Coastguard Worker ~A() 32*c05d8e5dSAndroid Build Coastguard Worker #if __has_feature(cxx_noexcept) 33*c05d8e5dSAndroid Build Coastguard Worker noexcept(false) 34*c05d8e5dSAndroid Build Coastguard Worker #endif 35*c05d8e5dSAndroid Build Coastguard Worker { 36*c05d8e5dSAndroid Build Coastguard Worker B b; 37*c05d8e5dSAndroid Build Coastguard Worker throw 0; 38*c05d8e5dSAndroid Build Coastguard Worker } 39*c05d8e5dSAndroid Build Coastguard Worker }; 40*c05d8e5dSAndroid Build Coastguard Worker } // test1 41*c05d8e5dSAndroid Build Coastguard Worker my_terminate()42*c05d8e5dSAndroid Build Coastguard Workervoid my_terminate() { exit(0); } 43*c05d8e5dSAndroid Build Coastguard Worker 44*c05d8e5dSAndroid Build Coastguard Worker template <class T> destroy(void * v)45*c05d8e5dSAndroid Build Coastguard Workervoid destroy(void* v) 46*c05d8e5dSAndroid Build Coastguard Worker { 47*c05d8e5dSAndroid Build Coastguard Worker T* t = static_cast<T*>(v); 48*c05d8e5dSAndroid Build Coastguard Worker t->~T(); 49*c05d8e5dSAndroid Build Coastguard Worker } 50*c05d8e5dSAndroid Build Coastguard Worker main()51*c05d8e5dSAndroid Build Coastguard Workerint main() 52*c05d8e5dSAndroid Build Coastguard Worker { 53*c05d8e5dSAndroid Build Coastguard Worker std::set_terminate(my_terminate); 54*c05d8e5dSAndroid Build Coastguard Worker { 55*c05d8e5dSAndroid Build Coastguard Worker typedef test1::A Array[10]; 56*c05d8e5dSAndroid Build Coastguard Worker Array a[10]; // calls _cxa_vec_dtor 57*c05d8e5dSAndroid Build Coastguard Worker __cxxabiv1::__cxa_vec_dtor(a, 10, sizeof(test1::A), destroy<test1::A>); 58*c05d8e5dSAndroid Build Coastguard Worker assert(false); 59*c05d8e5dSAndroid Build Coastguard Worker } 60*c05d8e5dSAndroid Build Coastguard Worker } 61