xref: /aosp_15_r20/external/libcxxabi/test/test_vector3.pass.cpp (revision c05d8e5dc3e10f6ce4317e8bc22cc4a25f55fa94)
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 Worker void my_terminate() { exit(0); }
43*c05d8e5dSAndroid Build Coastguard Worker 
44*c05d8e5dSAndroid Build Coastguard Worker template <class T>
destroy(void * v)45*c05d8e5dSAndroid Build Coastguard Worker void 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 Worker int 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