1 // { dg-do run { xfail sparc64-*-elf arm-*-pe } }
2 // { dg-options "-fexceptions" }
3 
4 #include <cstdlib>
5 #include <iostream>
6 
7 class Vector {
8 private:
9   int *p;
10   int sz;
11 
12 public:
13   // Exception class
14   class Range     {
15   private:
16     int value_i;
17 
18   public:
Range(int i)19     Range( int i ) { value_i = i; };
value()20     int value() { return value_i; };
21   };
22 
23   Vector( int s );
24   ~Vector();
size()25   int  size() { return sz; };
26   int& operator []( int i );
27 };
28 
Vector(int s)29 Vector::Vector(int s) {
30   sz = s;
31   p = new int[sz];
32 }
33 
~Vector()34 Vector::~Vector() {
35   delete [] p;
36 }
37 
38 int&
39 Vector::operator [](int i) {
40   if (0<=i && i<sz) {
41     return p[i];
42   } else {
43     throw Range( i );
44   }
45 }
46 
crash(Vector & v)47 void crash(Vector& v ) {
48   v[v.size()+10];  // Triggers range error!
49 }
50 
do_something(Vector & v)51 void do_something(Vector& v) {
52   crash( v );
53 }
54 
55 void
f(Vector & v)56 f(Vector& v) {
57   try {
58     do_something( v );
59   } catch (Vector::Range& r) {
60     std::cout << "Invalid vector range " << r.value()
61       << " caught in f()" << std::endl;
62     std::exit(0);
63   }
64 }
65 
66 int
main()67 main() {
68   Vector v(10);
69 
70   f( v );
71   return 1;
72 }
73