diff options
Diffstat (limited to 'gcc/testsuite/g++.old-deja/g++.robertl/eh990323-1.C')
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.robertl/eh990323-1.C | 77 |
1 files changed, 77 insertions, 0 deletions
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 000000000..221a6d79c --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.robertl/eh990323-1.C @@ -0,0 +1,77 @@ +// { dg-do run } +// check cleanup of template temporaries +extern "C" void abort (); +extern "C" void exit (int); + +int ctor = 0; +int dtor = 0; + +template <class T> struct A { + A() {ctor++;} + A(int) {ctor++;} + A(const A&) {ctor++;} + ~A() {dtor++;} + operator int() {return 0;} +}; + +template <class T> void ff(T); + +template <class T> void ff(T) +{ +} + +void g(int) +{ +} + +void f() +{ + int x; + + A<int> a1; + A<double> a2(37); + A<long> a3 = A<long>(47); + A<short> a4 = 97; + + g(A<char*>()); + + A<char**>(); + + x ? A<char*>() : A<char*>(); + + x = 47, A<double*>(), A<int>(39), A<void>(23), -17; + + while (A<short>()) + ; + for (;A<unsigned>(3);) + ; + if (A<A<double> >()) + ; + + ff(A<double>()); + + throw 59; +} + +int +main() +{ + int flag = 0; + + try { + A<unsigned long>(); + f(); + } + catch (int) { + A<float>(34); + flag = 1; + } + + if (!flag) + abort(); + + if (!ctor || ctor != dtor) + abort(); + + exit(0); +} |