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)29Vector::Vector(int s) { 30 sz = s; 31 p = new int[sz]; 32 } 33 ~Vector()34Vector::~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)47void crash(Vector& v ) { 48 v[v.size()+10]; // Triggers range error! 49 } 50 do_something(Vector & v)51void do_something(Vector& v) { 52 crash( v ); 53 } 54 55 void f(Vector & v)56f(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()67main() { 68 Vector v(10); 69 70 f( v ); 71 return 1; 72 } 73