os/ossrv/genericopenlibs/cppstdlib/stl/test/compiler/StTerm-order/stterm-test.cc
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
/*
sl@0
     2
 * The conversation with Matti Rintala on STLport forum 2005-08-24:
sl@0
     3
 *
sl@0
     4
 * Do you mean ISO/IEC 14882 3.6.3 [basic.start.term]?
sl@0
     5
 *
sl@0
     6
 * Yes. "Destructors (12.4) for initialized objects of static storage duration
sl@0
     7
 * (declared at block scope or at namespace scope) are called as a result
sl@0
     8
 * of returning from main and as a result of calling exit (18.3). These objects
sl@0
     9
 * are destroyed in the reverse order of the completion of their constructor
sl@0
    10
 * or of the completion of their dynamic initialization."
sl@0
    11
 *
sl@0
    12
 * I found a confirmation on the web that gcc may not strictly conform
sl@0
    13
 * to this behaviour in certains cases unless -fuse-cxa-atexit is used.
sl@0
    14
 *
sl@0
    15
 * Test below give (without -fuse-cxa-atexit)
sl@0
    16
sl@0
    17
Init::Init()
sl@0
    18
Init::use_it
sl@0
    19
It ctor done    <-- 0
sl@0
    20
Init::use_it done
sl@0
    21
Init ctor done  <-- 1
sl@0
    22
Init2 ctor done <-- 2
sl@0
    23
It dtor done    <-- 0
sl@0
    24
Init2 dtor done <-- 2
sl@0
    25
Init dtor done  <-- 1
sl@0
    26
sl@0
    27
sl@0
    28
 * but should:
sl@0
    29
sl@0
    30
Init::Init()
sl@0
    31
Init::use_it
sl@0
    32
It ctor done    <-- 0
sl@0
    33
Init::use_it done
sl@0
    34
Init ctor done  <-- 1
sl@0
    35
Init2 ctor done <-- 2
sl@0
    36
Init2 dtor done <-- 2
sl@0
    37
Init dtor done  <-- 1
sl@0
    38
It dtor done    <-- 0
sl@0
    39
sl@0
    40
sl@0
    41
 */
sl@0
    42
#include <stdio.h>
sl@0
    43
sl@0
    44
using namespace std;
sl@0
    45
sl@0
    46
class Init
sl@0
    47
{
sl@0
    48
  public:
sl@0
    49
    Init();
sl@0
    50
    ~Init();
sl@0
    51
sl@0
    52
    static void use_it();
sl@0
    53
};
sl@0
    54
sl@0
    55
class Init2
sl@0
    56
{
sl@0
    57
  public:
sl@0
    58
    Init2();
sl@0
    59
    ~Init2();
sl@0
    60
sl@0
    61
};
sl@0
    62
sl@0
    63
static Init init;
sl@0
    64
static Init2 init2;
sl@0
    65
sl@0
    66
class It
sl@0
    67
{
sl@0
    68
  public:
sl@0
    69
    It();
sl@0
    70
    ~It();
sl@0
    71
};
sl@0
    72
sl@0
    73
Init::Init()
sl@0
    74
{
sl@0
    75
  printf( "Init::Init()\n" );
sl@0
    76
  use_it();
sl@0
    77
  printf( "Init ctor done\n" );
sl@0
    78
}
sl@0
    79
sl@0
    80
Init::~Init()
sl@0
    81
{
sl@0
    82
  printf( "Init dtor done\n" );
sl@0
    83
}
sl@0
    84
sl@0
    85
void Init::use_it()
sl@0
    86
{
sl@0
    87
  printf( "Init::use_it\n" );
sl@0
    88
sl@0
    89
  static It it;
sl@0
    90
sl@0
    91
  printf( "Init::use_it done\n" );
sl@0
    92
}
sl@0
    93
sl@0
    94
Init2::Init2()
sl@0
    95
{
sl@0
    96
  printf( "Init2 ctor done\n" );
sl@0
    97
}
sl@0
    98
sl@0
    99
Init2::~Init2()
sl@0
   100
{
sl@0
   101
  printf( "Init2 dtor done\n" );
sl@0
   102
}
sl@0
   103
sl@0
   104
It::It()
sl@0
   105
{
sl@0
   106
  printf( "It ctor done\n" );
sl@0
   107
}
sl@0
   108
sl@0
   109
It::~It()
sl@0
   110
{
sl@0
   111
  printf( "It dtor done\n" );
sl@0
   112
}
sl@0
   113
sl@0
   114
int main()
sl@0
   115
{
sl@0
   116
  return 0;
sl@0
   117
}