diff -r e20de85af2ee -r ce057bb09d0b genericopenlibs/cppstdlib/stl/test/compiler/StTerm-order/stterm-test.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/genericopenlibs/cppstdlib/stl/test/compiler/StTerm-order/stterm-test.cc Fri Jun 04 16:20:51 2010 +0100 @@ -0,0 +1,117 @@ +/* + * The conversation with Matti Rintala on STLport forum 2005-08-24: + * + * Do you mean ISO/IEC 14882 3.6.3 [basic.start.term]? + * + * Yes. "Destructors (12.4) for initialized objects of static storage duration + * (declared at block scope or at namespace scope) are called as a result + * of returning from main and as a result of calling exit (18.3). These objects + * are destroyed in the reverse order of the completion of their constructor + * or of the completion of their dynamic initialization." + * + * I found a confirmation on the web that gcc may not strictly conform + * to this behaviour in certains cases unless -fuse-cxa-atexit is used. + * + * Test below give (without -fuse-cxa-atexit) + +Init::Init() +Init::use_it +It ctor done <-- 0 +Init::use_it done +Init ctor done <-- 1 +Init2 ctor done <-- 2 +It dtor done <-- 0 +Init2 dtor done <-- 2 +Init dtor done <-- 1 + + + * but should: + +Init::Init() +Init::use_it +It ctor done <-- 0 +Init::use_it done +Init ctor done <-- 1 +Init2 ctor done <-- 2 +Init2 dtor done <-- 2 +Init dtor done <-- 1 +It dtor done <-- 0 + + + */ +#include + +using namespace std; + +class Init +{ + public: + Init(); + ~Init(); + + static void use_it(); +}; + +class Init2 +{ + public: + Init2(); + ~Init2(); + +}; + +static Init init; +static Init2 init2; + +class It +{ + public: + It(); + ~It(); +}; + +Init::Init() +{ + printf( "Init::Init()\n" ); + use_it(); + printf( "Init ctor done\n" ); +} + +Init::~Init() +{ + printf( "Init dtor done\n" ); +} + +void Init::use_it() +{ + printf( "Init::use_it\n" ); + + static It it; + + printf( "Init::use_it done\n" ); +} + +Init2::Init2() +{ + printf( "Init2 ctor done\n" ); +} + +Init2::~Init2() +{ + printf( "Init2 dtor done\n" ); +} + +It::It() +{ + printf( "It ctor done\n" ); +} + +It::~It() +{ + printf( "It dtor done\n" ); +} + +int main() +{ + return 0; +}