OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [testsuite/] [g++.old-deja/] [g++.eh/] [catch5p.C] - Blame information for rev 699

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 699 jeremybenn
// { dg-do run  }
2
// { dg-options "-w" }
3
// Copyright (C) 1999, 2000 Free Software Foundation, Inc.
4
// Contributed by Nathan Sidwell 29 Aug 1999 
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
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.