summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.old-deja/g++.other/singleton.C
blob: 2a27ca3cd8ef649ed2db939b7c73cffed32bb70e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// { dg-do run  }
// This tests two things:
// 1. there is an annoying warning.
// singleton.C:26: warning: `class singleton' only defines private constructors and has no friends
// egcs fails to see that there is a public static accessor function.
// 2. the program crashes, because apparently the static variable s in
// singleton::instance() is considered constructed although the ctor
// exited via an exception. (crash changed to nonzero return here)

class singleton {
public:
       static singleton& instance() {
               static singleton s;
               return s;
       }
       int check() {return initialized;}

private:
       singleton() : initialized(1) {
               if ( counter++ == 0 ) throw "just for the heck of it";
               initialized = 2;
       }
       singleton( const singleton& rhs );
       void operator=( const singleton& rhs );
       int initialized;
       static int counter;
};  

int singleton::counter;

int main()
{
       while (1) {
               try {
                       return singleton::instance().check()-2;
               } catch (...) { }
       }
}