OSDN Git Service

* lib/g++-dg.exp (g++-dg-test): Add "repo" option.
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / g++.old-deja / g++.eh / catch5p.C
1 // { dg-do run  }
2 // { dg-options "-w" }
3 // Copyright (C) 1999, 2000 Free Software Foundation, Inc.
4 // Contributed by Nathan Sidwell 29 Aug 1999 <nathan@acm.org>
5
6 // We cannot catch an ambiguous base class.
7 // -- public, << private, == virtual
8
9 // D--B==A
10 // +--C==A
11 // +--AA-A
12
13
14 struct A { int m; virtual ~A(){}};
15 struct B : virtual A { int m; };
16 struct C : virtual A { int m; };
17 struct AA : A { int m; };
18 struct D : B, C, AA { int m; };
19
20 void fna(A *obj) { throw obj; }
21 void fnb(B *obj) { throw obj; }
22 void fnc(C *obj) { throw obj; }
23 void fnd(D *obj) { throw obj; }
24 void fnaa(AA *obj) { throw obj; }
25
26 extern "C" void abort();
27
28 void check(D *d)
29 {
30   int caught;
31   
32   // try with whole object
33   caught = 0;
34   try { fnd(d); }
35   catch(A *p) { abort(); } // A is ambiguous
36   catch(D *p) { caught = 1; if (p != d) abort();}
37   catch(...) { abort(); }
38   if (!caught) abort();
39
40   caught = 0;
41   try { fnd(d); }
42   catch(A *p) { abort(); } // A is ambiguous
43   catch(B *p) { caught = 1; if (p != d) abort();}
44   catch(...) { abort(); }
45   if (!caught) abort();
46
47   caught = 0;
48   try { fnd(d); }
49   catch(A *p) { abort(); } // A is ambiguous
50   catch(C *p) { caught = 1; if (p != d) abort();}
51   catch(...) { abort(); }
52   if (!caught) abort();
53
54   caught = 0;
55   try { fnd(d); }
56   catch(A *p) { abort(); } // A is ambiguous
57   catch(AA *p) { caught = 1; if (p != d) abort();}
58   catch(...) { abort(); }
59   if (!caught) abort();
60
61   // try with an A object
62   caught = 0;
63   try { fna((B *)d); }
64   catch(B *p) { abort(); } // throw type is static type
65   catch(A *p) { caught = 1; if (p != (B *)d) abort();}
66   catch(...) { abort(); }
67   if (!caught) abort();
68   
69   caught = 0;
70   try { fna((C *)d); }
71   catch(C *p) { abort(); } // throw type is static type
72   catch(A *p) { caught = 1; if (p != (C *)d) abort();}
73   catch(...) { abort(); }
74   if (!caught) abort();
75   
76   caught = 0;
77   try { fna((AA *)d); }
78   catch(AA *p) { abort(); } // throw type is static type
79   catch(A *p) { caught = 1; if (p != (AA *)d) abort();}
80   catch(...) { abort(); }
81   if (!caught) abort();
82   
83   // try with B object
84   caught = 0;
85   try { fnb((B *)d); }
86   catch(A *p) { caught = 1; if (p != (B *)d) abort();}
87   catch(...) { abort(); }
88   if (!caught) abort();
89   
90   caught = 0;
91   try { fnb((B *)d); }
92   catch(B *p) { caught = 1; if (p != d) abort();}
93   catch(...) { abort(); }
94   if (!caught) abort();
95   
96   caught = 0;
97   try { fnb((B *)d); }
98   catch(C *p) { abort(); }
99   catch(D *p) { abort(); }
100   catch(...) { caught =1; }
101   if (!caught) abort();
102   
103   // try with C object
104   caught = 0;
105   try { fnc((C *)d); }
106   catch(A *p) { caught = 1; if (p != (C *)d) abort();}
107   catch(...) { abort(); }
108   if (!caught) abort();
109   
110   caught = 0;
111   try { fnc((C *)d); }
112   catch(C *p) { caught = 1; if (p != d) abort();}
113   catch(...) { abort(); }
114   if (!caught) abort();
115   
116   caught = 0;
117   try { fnc((C *)d); }
118   catch(B *p) { abort(); }
119   catch(D *p) { abort(); }
120   catch(...) { caught =1; }
121   if (!caught) abort();
122   
123   // try with AA object
124   caught = 0;
125   try { fnaa((AA *)d); }
126   catch(A *p) { caught = 1; if (p != (AA *)d) abort();}
127   catch(...) { abort(); }
128   if (!caught) abort();
129   
130   caught = 0;
131   try { fnaa((AA *)d); }
132   catch(AA *p) { caught = 1; if (p != d) abort();}
133   catch(...) { abort(); }
134   if (!caught) abort();
135   
136   caught = 0;
137   try { fnaa((AA *)d); }
138   catch(C *p) { abort(); }
139   catch(B *p) { abort(); }
140   catch(D *p) { abort(); }
141   catch(...) { caught =1; }
142   if (!caught) abort();
143   
144   return;
145 }
146
147 int main ()
148 {
149   D d;
150   check (&d); // try with an object
151   check ((D *)0); // try with no object
152   
153   return 0;
154 }