1 // { dg-do run { xfail { { ! cxa_atexit } && { ! *-*-solaris2* } } } } 2 // { dg-require-effective-target cxa_atexit } 3 #include <stdlib.h> 4 5 #define assert(x) do { if (! (x)) abort(); } while (0) 6 7 int count = 0; 8 9 class A 10 { 11 public: 12 explicit A(int i); 13 ~A(); 14 15 int i; 16 17 A(const A&); 18 A& operator=(const A&); 19 }; 20 A(int i_)21A::A(int i_) 22 : i(i_) 23 { 24 } 25 ~A()26A::~A() 27 { 28 assert(++count == i); 29 i = -1; 30 } 31 32 extern "C" { 33 one()34void one() 35 { 36 static bool second_time; 37 if (second_time) 38 assert(++count == 9); 39 else 40 { 41 assert(++count == 1); 42 second_time = true; 43 } 44 static A a(10); 45 assert(a.i == 10); 46 } 47 two()48void two() 49 { 50 assert(++count == 7); 51 static A a(8); 52 assert(a.i == 8); 53 } 54 three()55void three() 56 { 57 assert(++count == 2); 58 static A a(6); 59 assert(a.i == 6); 60 } 61 five()62void five() 63 { 64 assert(++count == 4); 65 static A a(5); 66 assert(a.i == 5); 67 } 68 four()69void four() 70 { 71 assert(++count == 3); 72 atexit(five); 73 } 74 75 } 76 77 A zero(11); 78 main()79int main() 80 { 81 one(); 82 atexit(one); 83 atexit(two); 84 three(); 85 atexit(four); 86 } 87