first commit
This commit is contained in:
117
extern/STLport/5.2.1/test/compiler/StTerm-order/stterm-test.cc
vendored
Normal file
117
extern/STLport/5.2.1/test/compiler/StTerm-order/stterm-test.cc
vendored
Normal file
@@ -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 <stdio.h>
|
||||
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user