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 10 class singleton { 11 public: instance()12 static singleton& instance() { 13 static singleton s; 14 return s; 15 } check()16 int check() {return initialized;} 17 18 private: singleton()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 29 int singleton::counter; 30 main()31int main() 32 { 33 while (1) { 34 try { 35 return singleton::instance().check()-2; 36 } catch (...) { } 37 } 38 } 39 40