| // Some targets (e.g. those with "set_board_info needs_status_wrapper 1" |
| // in their dejagnu baseboard description) require that the status is |
| // final when exit is entered (or main returns), and not "overruled" by a |
| // destructor calling _exit. It's not really worth it to handle that. |
| // |
| // Any platform that doesn't have proper __cxa_atexit support will also fail. |
| // |
| // { dg-do run { xfail { { mmix-knuth-mmixware xtensa-*-elf* arm*-*-elf arm*-*-eabi m68k-*-elf } || { ! cxa_atexit } } } } |
| |
| #include <stdlib.h> |
| extern "C" void _exit (int); |
| |
| static int cnt = 0; |
| |
| class Foo2 |
| { |
| public: |
| Foo2() {}; |
| ~Foo2() { if (++cnt == 2) _exit (0); }; |
| }; |
| |
| static Foo2& GetFoo2() |
| { |
| static Foo2 foo2; |
| return foo2; |
| } |
| |
| class Foo1 |
| { |
| public: |
| Foo1() {} |
| ~Foo1() { if (++cnt != 1) abort(); GetFoo2(); }; |
| }; |
| |
| int main( int argc, const char* argv[] ) |
| { |
| static Foo1 anotherFoo; |
| exit (1); |
| } |
| |