This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: PATCH: Testcase for new C++ bug? Comments please. (COMMITTED)
- To: Klaus-Georg Adams <Klaus-Georg dot Adams at chemie dot uni-karlsruhe dot de>, egcs-patches at cygnus dot com
- Subject: Re: PATCH: Testcase for new C++ bug? Comments please. (COMMITTED)
- From: Robert Lipe <robertl at dgii dot com>
- Date: Fri, 10 Jul 1998 10:06:06 -0500
- References: <199807021116.NAA00663@achibm5.chemie.uni-karlsruhe.de>
After private discussion with Klaug-Georg and Martin concluding that the
abort is undisputedly a bug, I've committed this case.
The warning thing is still under debate. :-)
RJL
Klaus-Georg Adams wrote:
>
> I have come across a new failure of the C++ front-end. However I am
> not completely sure if the program is legal (I think it is, but you
> can try to convince me otherwise).
>
> The warning which is triggered is bad in any case.
>
> -- kga
> -------------------------------------------------------------------------
> Klaus-Georg Adams Email: Klaus-Georg.Adams@chemie.uni-karlsruhe.de
> Institut f. Anorg. Chemie, Lehrstuhl II Tel: 49(0)721 608 3485
> Universität Karlsruhe, D-76128 Karlsruhe
> -------------------------------------------------------------------------
>
> --- /dev/null Mon Jul 18 01:46:18 1994
> +++ gcc/testsuite/g++.old-deja/g++.other/singleton.C Thu Jul 2 13:03:19 1998
> @@ -0,0 +1,38 @@
> +// 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.
> +
> +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 (...) { }
> + }
> +}
--
Robert Lipe http://www.dgii.com/people/robertl robertl@dgii.com
(WEB ADDRESS MAY BE TEMPORARILY UNAVAILABLE)