1// { dg-do run  }
2// This tests two things:
3// 1. there is an annoying warning.
4// singleton.C:26: warning: `class singleton' only defines private constructors and has no friends
5// egcs fails to see that there is a public static accessor function.
6// 2. the program crashes, because apparently the static variable s in
7// singleton::instance() is considered constructed although the ctor
8// exited via an exception. (crash changed to nonzero return here)
9
10class singleton {
11public:
12       static singleton& instance() {
13               static singleton s;
14               return s;
15       }
16       int check() {return initialized;}
17
18private:
19       singleton() : initialized(1) {
20               if ( counter++ == 0 ) throw "just for the heck of it";
21               initialized = 2;
22       }
23       singleton( const singleton& rhs );
24       void operator=( const singleton& rhs );
25       int initialized;
26       static int counter;
27};
28
29int singleton::counter;
30
31int main()
32{
33       while (1) {
34               try {
35                       return singleton::instance().check()-2;
36               } catch (...) { }
37       }
38}
39
40