Home | History | Annotate | Download | only in testsuite
      1 // constructor_test.cc -- a test case for gold global constructors
      2 
      3 // Copyright (C) 2006-2016 Free Software Foundation, Inc.
      4 // Written by Ian Lance Taylor <iant (at) 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 
     32 int c1_count;
     33 int c2_count;
     34 int 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 
     40 class 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 
     55 c1 c1v;
     56 
     57 // A function called at atexit time.
     58 
     59 void
     60 atexit_function()
     61 {
     62   --atexit_count;
     63   assert(atexit_count == c2_count);
     64 }
     65 
     66 // A class which counts itself and also calls atexit.
     67 
     68 class 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 
     83 c2 c2v1;
     84 c2 c2v2;
     85 
     86 int
     87 main()
     88 {
     89   return 0;
     90 }
     91