From: Robert Lipe Date: Fri, 28 May 1999 13:26:49 +0000 (+0000) Subject: "New" testsuite entries approved by Jeff on 5/23. X-Git-Tag: releases/libgcj-2.95.0~331 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d664559da21b92af3169f1c11e17f63bd030d168;p=thirdparty%2Fgcc.git "New" testsuite entries approved by Jeff on 5/23. From-SVN: r27222 --- diff --git a/gcc/testsuite/g++.old-deja/g++.robertl/eh990323-1.C b/gcc/testsuite/g++.old-deja/g++.robertl/eh990323-1.C new file mode 100644 index 000000000000..9bf8a098c0fb --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.robertl/eh990323-1.C @@ -0,0 +1,74 @@ +// check cleanup of template temporaries + +int ctor = 0; +int dtor = 0; + +template struct A { + A() {ctor++;} + A(int) {ctor++;} + A(const A&) {ctor++;} + ~A() {dtor++;} + operator int() {return 0;} +}; + +template void ff(T); + +template void ff(T) +{ +} + +void g(void) +{ +} + +void f() +{ + int x; + + A a1; + A a2(37); + A a3 = A(47); + A a4 = 97; + + g(A()); + + A(); + + x ? A() : A(); + + x = 47, A(), A(39), A(23), -17; + + while (A()) + ; + for (;A(3);) + ; + if (A >()) + ; + + ff(A()); + + throw 59; +} + +int +main() +{ + int flag = 0; + + try { + A(); + f(); + } + catch (int) { + A(34); + flag = 1; + } + + if (!flag) + abort(); + + if (!ctor || ctor != dtor) + abort(); + + exit(0); +} diff --git a/gcc/testsuite/g++.old-deja/g++.robertl/eh990323-2.C b/gcc/testsuite/g++.old-deja/g++.robertl/eh990323-2.C new file mode 100644 index 000000000000..90d93ad92118 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.robertl/eh990323-2.C @@ -0,0 +1,100 @@ +// check MI and VBC offsets on throw + +struct A { + int x[23]; +}; + +struct B : virtual public A { + int y[33]; +}; + +struct C : virtual public A, public B { + int z[43]; +}; + +struct D { + int xx[53]; +}; + +struct E : public D, public A { + int yy[63]; +}; + +C c; + +E e; + +void f1() +{ + throw (C*)0; +} + +void f2() +{ + throw &c; +} + +void f3() +{ + throw (E*)0; +} + +void f4() +{ + throw &e; +} + +int main() +{ + int flag; + + flag = 0; + try { + f1(); + } + catch (A* p) { + if (p) + abort(); + flag = 1; + } + if (!flag) + abort(); + + flag = 0; + try { + f2(); + } + catch (A* p) { + if (!p || (void*)p == (void*)&c) + abort(); + flag = 1; + } + if (!flag) + abort(); + + flag = 0; + try { + f3(); + } + catch (A* p) { + if (p) + abort(); + flag = 1; + } + if (!flag) + abort(); + + flag = 0; + try { + f4(); + } + catch (A* p) { + if (!p || (void*)p == (void*)&e) + abort(); + flag = 1; + } + if (!flag) + abort(); + + exit(0); +} diff --git a/gcc/testsuite/g++.old-deja/g++.robertl/eh990323-3.C b/gcc/testsuite/g++.old-deja/g++.robertl/eh990323-3.C new file mode 100644 index 000000000000..5d945154aafa --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.robertl/eh990323-3.C @@ -0,0 +1,27 @@ +// try throwing 0 cast to a class object + +struct A {}; + +void f() +{ + throw (A*)0; +} + +int +main() +{ + int flag; + + flag = 0; + try { + f(); + } + catch (A*) { + flag = 1; + } + + if (!flag) + abort(); + + exit (0); +} diff --git a/gcc/testsuite/g++.old-deja/g++.robertl/eh990323-4.C b/gcc/testsuite/g++.old-deja/g++.robertl/eh990323-4.C new file mode 100644 index 000000000000..315a78b4bb15 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.robertl/eh990323-4.C @@ -0,0 +1,101 @@ +// check MI and VBC offsets on throw + +struct A { + int x[23]; +}; + +struct B : virtual public A { + int y[33]; +}; + +struct C : virtual public A, public B { + int z[43]; +}; + +struct D { + int xx[53]; +}; + +struct E : public D, public A { + int yy[63]; +}; + +C c; + +E e; + +void f1() +{ + throw (C*)0; +} + +void f2() +{ + throw &c; +} + +void f3() +{ + throw (E*)0; +} + +void f4() +{ + throw &e; +} + +int +main() +{ + int flag; + + flag = 0; + try { + f1(); + } + catch (void* p) { + if (p) + abort(); + flag = 1; + } + if (!flag) + abort(); + + flag = 0; + try { + f2(); + } + catch (void* p) { + if (!p || (void*)p != (void*)&c) + abort(); + flag = 1; + } + if (!flag) + abort(); + + flag = 0; + try { + f3(); + } + catch (void* p) { + if (p) + abort(); + flag = 1; + } + if (!flag) + abort(); + + flag = 0; + try { + f4(); + } + catch (void* p) { + if (!p || (void*)p != (void*)&e) + abort(); + flag = 1; + } + if (!flag) + abort(); + + exit(0); +} diff --git a/gcc/testsuite/g++.old-deja/g++.robertl/eh990323-5.C b/gcc/testsuite/g++.old-deja/g++.robertl/eh990323-5.C new file mode 100644 index 000000000000..7f52a9b8d86e --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.robertl/eh990323-5.C @@ -0,0 +1,65 @@ +// check cleanup of partial array objects + +int ctor = 0; +int dtor = 0; + +int cnt = 1; + +struct A { + int x; + A(); + A(const A&); + ~A(); +}; + +A::A() +{ + if (cnt == 10) + throw 57; + x = cnt++; + ctor++; +} + +A::A(const A&) +{ + if (cnt == 10) + throw 57; + x = cnt++; + ctor++; +} + +A::~A() +{ + if (x + 1 != cnt--) + abort(); + dtor++; +} + +void f() +{ + A a[] = {A(), A(), A(), A(), A(), A(), A(), A(), A(), A(), A(), A()}; + + throw -1066; +} + +int +main() +{ + int flag; + + flag = 0; + try { + f(); + } + catch (int) { + flag = 1; + } + if (!flag) + abort(); + if (ctor != 9) + abort(); + if (dtor != 9) + abort(); + + exit(0); +} diff --git a/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-1.C b/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-1.C new file mode 100644 index 000000000000..c03154bdf8a8 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-1.C @@ -0,0 +1,7 @@ +//test 2 +struct A {}; +void f() +{ + struct A; + throw *(new A); +} diff --git a/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-2.C b/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-2.C new file mode 100644 index 000000000000..3fa5bd566d16 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-2.C @@ -0,0 +1,85 @@ +// check EH with templates + +template struct A { + A() {} + A(char*) {} +}; + +void f1() +{ + throw *(new A >); +} + +void f2() +{ + throw *(new A >); +} + +void f3() +{ + throw A > ("howdy"); +} + +void f4() +{ + throw A > ("hi michey"); +} + +main() +{ + int flag; + + flag = 0; + try { + f1(); + } + catch (A >) { + abort(); + } + catch (A >) { + flag = 1; + } + if (!flag) + abort(); + + flag = 0; + try { + f2(); + } + catch (A >) { + abort(); + } + catch (A >) { + flag = 1; + } + if (!flag) + abort(); + + flag = 0; + try { + f3(); + } + catch (A >) { + abort(); + } + catch (A >) { + flag = 1; + } + if (!flag) + abort(); + + flag = 0; + try { + f4(); + } + catch (A >) { + abort(); + } + catch (A >) { + flag = 1; + } + if (!flag) + abort(); + + exit(0); +} diff --git a/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-3.C b/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-3.C new file mode 100644 index 000000000000..55cb16c705ed --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-3.C @@ -0,0 +1,14 @@ +// try throwing overloaded function + +void f(int) +{ +} + +void f(long) +{ +} + +void g() +{ + throw &f; +} diff --git a/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-4.C b/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-4.C new file mode 100644 index 000000000000..85bbb457d34d --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-4.C @@ -0,0 +1,12 @@ +// try throwing template function name + +template void f(T); + +template void f(T) +{ +} + +void g() +{ + throw &f; +} diff --git a/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-5.C b/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-5.C new file mode 100644 index 000000000000..c49b66e9fa58 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-5.C @@ -0,0 +1,11 @@ +// check attempting to throw an overloaded function + +struct A { + void f(int); + void f(long); +}; + +void g() +{ + throw &A::f; +}