| // { 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 (...) { } |
| } |
| } |
| |