From: Nathan Sidwell Date: Thu, 25 May 2000 11:16:11 +0000 (+0000) Subject: catch11.C: New test. X-Git-Tag: prereleases/libstdc++-2.92~6192 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=bebc2c610a138303843eb6de56ce9e842885686a;p=thirdparty%2Fgcc.git catch11.C: New test. * g++.old-deja/g++.eh/catch11.C: New test. * g++.old-deja/g++.eh/catch12.C: New test. From-SVN: r34164 --- diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1ec64a2665a8..ccdc8ddfd58f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2000-05-25 Nathan Sidwell + + * g++.old-deja/g++.eh/catch11.C: New test. + * g++.old-deja/g++.eh/catch12.C: New test. + 2000-05-24 Nick Clifton * gcc.c-torture/execute/20000523-1.c: New test. diff --git a/gcc/testsuite/g++.old-deja/g++.eh/catch11.C b/gcc/testsuite/g++.old-deja/g++.eh/catch11.C new file mode 100644 index 000000000000..298dd0398249 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.eh/catch11.C @@ -0,0 +1,63 @@ +// Copyright (C) 2000 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 24 May 2000 + +// we should be able to catch a base a virtual, provided it is accessible by at +// least one public path +// -- public, << private, == virtual +// E< + +// we should be able to catch a base a virtual, provided it is accessible by at +// least one public path +// -- public, << private, == virtual +// E--B<<==A +// +--C--==A +// +--D<<==A + +struct A {}; +struct B : private virtual A {}; +struct C : virtual A {}; +struct D : private virtual A {}; +struct E : public B, public C, public D {}; + +extern "C" void abort (); + +void fne (E *e) +{ + throw e; +} + +void check(E *e) +{ + int caught; + + caught = 0; + try { fne(e); } + catch(A *p) { caught = 1; if (p != e) abort();} + catch(...) { abort(); } + if (!caught) abort(); + + caught = 0; + try { fne(e); } + catch(B *p) { caught = 1; if (p != e) abort();} + catch(...) { abort (); } + if (!caught) abort(); + + caught = 0; + try { fne(e); } + catch(C *p) { caught = 1; if (p != e) abort();} + catch(...) { abort(); } + if (!caught) abort(); + + caught = 0; + try { fne(e); } + catch(D *p) { caught = 1; if (p != e) abort ();} + catch(...) { abort (); } + if (!caught) abort(); + + return; +} + +int main () +{ + E e; + + check (&e); + check ((E *)0); + + return 0; +}