diff options
Diffstat (limited to 'gcc/testsuite/g++.old-deja/g++.other/init19.C')
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.other/init19.C | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.old-deja/g++.other/init19.C b/gcc/testsuite/g++.old-deja/g++.other/init19.C new file mode 100644 index 000000000..bcbe82287 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.other/init19.C @@ -0,0 +1,85 @@ +// { dg-do run { xfail { { ! cxa_atexit } && { ! { mips-sgi-irix* *-*-solaris2* } } } } } +#include <stdlib.h> + +#define assert(x) do { if (! (x)) abort(); } while (0) + +int count = 0; + +class A +{ +public: + explicit A(int i); + ~A(); + + int i; + + A(const A&); + A& operator=(const A&); +}; + +A::A(int i_) + : i(i_) +{ +} + +A::~A() +{ + assert(++count == i); + i = -1; +} + +extern "C" { + +void one() +{ + static bool second_time; + if (second_time) + assert(++count == 9); + else + { + assert(++count == 1); + second_time = true; + } + static A a(10); + assert(a.i == 10); +} + +void two() +{ + assert(++count == 7); + static A a(8); + assert(a.i == 8); +} + +void three() +{ + assert(++count == 2); + static A a(6); + assert(a.i == 6); +} + +void five() +{ + assert(++count == 4); + static A a(5); + assert(a.i == 5); +} + +void four() +{ + assert(++count == 3); + atexit(five); +} + +} + +A zero(11); + +int main() +{ + one(); + atexit(one); + atexit(two); + three(); + atexit(four); +} |