1/* This test script is part of GDB, the GNU debugger.
2
3   Copyright 2002, 2004,
4   Free Software Foundation, Inc.
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 3 of the License, or
9   (at your option) any later version.
10
11   This program is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   GNU General Public License for more details.
15
16   You should have received a copy of the GNU General Public License
17   along with this program.  If not, see <http://www.gnu.org/licenses/>.
18   */
19
20#include <exception>
21#include <stdexcept>
22#include <string>
23
24enum region { oriental, egyptian, greek, etruscan, roman };
25
26// Test one.
27class gnu_obj_1
28{
29public:
30  typedef region antiquities;
31  const bool 		test;
32  const int 		key1;
33  long       		key2;
34
35  antiquities 	value;
36
37  gnu_obj_1(antiquities a, long l): test(true), key1(5), key2(l), value(a) {}
38};
39
40// Test two.
41template<typename T>
42class gnu_obj_2: public virtual gnu_obj_1
43{
44public:
45  antiquities	value_derived;
46
47  gnu_obj_2(antiquities b): gnu_obj_1(oriental, 7), value_derived(b) { }
48};
49
50// Test three.
51template<typename T>
52class gnu_obj_3
53{
54public:
55  typedef region antiquities;
56  gnu_obj_2<int>   	data;
57
58  gnu_obj_3(antiquities b): data(etruscan) { }
59};
60
61int main()
62{
63  bool test = true;
64  const int i = 5;
65  int j = i;
66  gnu_obj_2<long> test2(roman);
67  gnu_obj_3<long> test3(greek);
68
69  // 1
70  try
71    {
72      ++j;
73      throw gnu_obj_1(egyptian, 4589);	// marker 1-throw
74    }
75  catch (gnu_obj_1& obj)
76    {
77      ++j;
78      if (obj.value != egyptian)	// marker 1-catch
79	test &= false;
80      if (obj.key2 != 4589)
81	test &= false;
82    }
83  catch (...)
84    {
85      j = 0;
86      test &= false;
87    }
88
89  // 2
90  try
91    {
92      ++j;				// marker 2-start
93      try
94	{
95	  ++j;				// marker 2-next
96	  try
97	    {
98	      ++j;
99	      throw gnu_obj_1(egyptian, 4589); // marker 2-throw
100	    }
101	  catch (gnu_obj_1& obj)
102	    {
103	      ++j;
104	      if (obj.value != egyptian) // marker 2-catch
105		test &= false;
106	      if (obj.key2 != 4589)
107		test &= false;
108	    }
109	}
110      catch (gnu_obj_1& obj)
111	{
112	  ++j;
113	  if (obj.value != egyptian)
114	    test &= false;
115	  if (obj.key2 != 4589)
116	    test &= false;
117	}
118    }
119  catch (...)
120    {
121      j = 0;
122      test &= false;
123    }
124
125  // 3 use standard library
126  using namespace std;
127  try
128    {
129      if (j < 100)
130	throw invalid_argument("gdb.1"); // marker 3-throw
131    }
132  catch (exception& obj)
133    {
134      if (obj.what() != "gdb.1")	// marker 3-catch
135	test &= false;
136    }
137  return 0;
138}
139