// { 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); }