150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/*
250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * The conversation with Matti Rintala on STLport forum 2005-08-24:
350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *
450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Do you mean ISO/IEC 14882 3.6.3 [basic.start.term]?
550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *
650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Yes. "Destructors (12.4) for initialized objects of static storage duration
750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * (declared at block scope or at namespace scope) are called as a result
850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * of returning from main and as a result of calling exit (18.3). These objects
950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * are destroyed in the reverse order of the completion of their constructor
1050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * or of the completion of their dynamic initialization."
1150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *
1250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * I found a confirmation on the web that gcc may not strictly conform
1350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * to this behaviour in certains cases unless -fuse-cxa-atexit is used.
1450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *
1550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Test below give (without -fuse-cxa-atexit)
1650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
1750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoInit::Init()
1850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoInit::use_it
1950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoIt ctor done    <-- 0
2050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoInit::use_it done
2150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoInit ctor done  <-- 1
2250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoInit2 ctor done <-- 2
2350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoIt dtor done    <-- 0
2450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoInit2 dtor done <-- 2
2550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoInit dtor done  <-- 1
2650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
2750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
2850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * but should:
2950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
3050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoInit::Init()
3150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoInit::use_it
32It ctor done    <-- 0
33Init::use_it done
34Init ctor done  <-- 1
35Init2 ctor done <-- 2
36Init2 dtor done <-- 2
37Init dtor done  <-- 1
38It dtor done    <-- 0
39
40
41 */
42#include <stdio.h>
43
44using namespace std;
45
46class Init
47{
48  public:
49    Init();
50    ~Init();
51
52    static void use_it();
53};
54
55class Init2
56{
57  public:
58    Init2();
59    ~Init2();
60
61};
62
63static Init init;
64static Init2 init2;
65
66class It
67{
68  public:
69    It();
70    ~It();
71};
72
73Init::Init()
74{
75  printf( "Init::Init()\n" );
76  use_it();
77  printf( "Init ctor done\n" );
78}
79
80Init::~Init()
81{
82  printf( "Init dtor done\n" );
83}
84
85void Init::use_it()
86{
87  printf( "Init::use_it\n" );
88
89  static It it;
90
91  printf( "Init::use_it done\n" );
92}
93
94Init2::Init2()
95{
96  printf( "Init2 ctor done\n" );
97}
98
99Init2::~Init2()
100{
101  printf( "Init2 dtor done\n" );
102}
103
104It::It()
105{
106  printf( "It ctor done\n" );
107}
108
109It::~It()
110{
111  printf( "It dtor done\n" );
112}
113
114int main()
115{
116  return 0;
117}
118