singleton.C: New test.
authorKlaus-Georg Adams <Klaus-Georg.Adams@chemie.uni-karlsruhe.de>
Fri, 10 Jul 1998 08:03:35 +0000 (08:03 +0000)
committerRobert Lipe <robertl@gcc.gnu.org>
Fri, 10 Jul 1998 08:03:35 +0000 (08:03 +0000)
*  g++.other/singleton.C: New test.   Warning is under dispute.
Runtime crash is not.

From-SVN: r21050

gcc/testsuite/ChangeLog
gcc/testsuite/g++.old-deja/g++.other/singleton.C [new file with mode: 0644]

index 249483d5495608eec515866bd50a20c7c76a8a55..9fe92bd055f0c8d2edb93001846fa4fc3b1df969 100644 (file)
@@ -1,3 +1,8 @@
+Fri Jul 10 10:02:03 1998  Klaus-Georg Adams <Klaus-Georg.Adams@chemie.uni-karlsruhe.de> 
+
+       *  g++.other/singleton.C: New test.   Warning is under dispute.
+       Runtime crash is not.
+
 Thu Jul  9 23:07:45 1998  Martin von Loewis <martin@mira.isdn.cs.tu-berlin.de>
 
        * g++.ns/{alias2.C, alias5.C, koenig4.C, lookup3.C ns13.C, 
diff --git a/gcc/testsuite/g++.old-deja/g++.other/singleton.C b/gcc/testsuite/g++.old-deja/g++.other/singleton.C
new file mode 100644 (file)
index 0000000..32722c3
--- /dev/null
@@ -0,0 +1,38 @@
+// This tests two things:
+// 1. there is an annoying warning. singleton.C:27: 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.
+
+class singleton {
+public:
+       static singleton& instance() {
+               static singleton s;
+               return s;
+       }
+       ~singleton() { delete sigsegv; }
+       int crash() { return *sigsegv; }
+
+private:
+       singleton() : sigsegv(0) {
+               if ( counter++ == 0 ) throw "just for the heck of it";
+               sigsegv = new int(0);
+       }
+       singleton( const singleton& rhs );
+       void operator=( const singleton& rhs );
+       int* sigsegv;
+       static int counter;
+};
+
+int singleton::counter;
+
+int main()
+{
+       while (1) {
+               try {
+                       return singleton::instance().crash();
+               } catch (...) { }
+       }
+}