summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.old-deja/g++.robertl/eh990323-1.C
blob: 221a6d79c47f13033f7f79da94e01f1f10fb3ea4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
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);
}