1// constructor_test.cc -- a test case for gold global constructors
2
3// Copyright (C) 2006-2017 Free Software Foundation, Inc.
4// Written by Ian Lance Taylor <iant@google.com>.
5
6// This file is part of gold.
7
8// This program is free software; you can redistribute it and/or modify
9// it under the terms of the GNU General Public License as published by
10// the Free Software Foundation; either version 3 of the License, or
11// (at your option) any later version.
12
13// This program is distributed in the hope that it will be useful,
14// but WITHOUT ANY WARRANTY; without even the implied warranty of
15// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16// GNU General Public License for more details.
17
18// You should have received a copy of the GNU General Public License
19// along with this program; if not, write to the Free Software
20// Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21// MA 02110-1301, USA.
22
23// This file just runs some global constructors and destructors.  The
24// last global destructor verifies that the state is as expected, and
25// we assume that it runs correctly itself.
26
27#include <cassert>
28#include <cstdlib>
29
30// These counters let us verify the state.
31
32int c1_count;
33int c2_count;
34int atexit_count;
35
36// This class verifies that there are no objects left when it is
37// destroyed.  Therefore, we can only have one instance of this
38// object.
39
40class c1
41{
42 public:
43  static int count;
44
45  c1()
46  { ++c1_count; }
47
48  ~c1()
49  {
50    --c1_count;
51    assert(c1_count == 0 && c2_count == 0 && atexit_count == 0);
52  }
53};
54
55c1 c1v;
56
57// A function called at atexit time.
58
59void
60atexit_function()
61{
62  --atexit_count;
63  assert(atexit_count == c2_count);
64}
65
66// A class which counts itself and also calls atexit.
67
68class c2
69{
70 public:
71  c2()
72  {
73    assert(atexit_count == c2_count);
74    ++c2_count;
75    atexit(atexit_function);
76    ++atexit_count;
77  }
78
79  ~c2()
80  { --c2_count; }
81};
82
83c2 c2v1;
84c2 c2v2;
85
86int
87main()
88{
89  return 0;
90}
91