1 // { dg-do run } 2 // { dg-options "-O" } 3 // PRMS Id: 10776 4 5 extern "C" int printf (const char *, ...); 6 7 class Foo 8 { 9 public: Foo(int n)10 Foo(int n) : n_(n) { } f()11 int f() { return n_; } 12 13 int badTest(); 14 int goodTest(); 15 16 private: 17 18 int n_; 19 }; 20 badTest()21int Foo::badTest() 22 { 23 try { 24 throw int(99); 25 } 26 27 catch (int &i) { 28 n_ = 16; 29 } 30 31 return n_; 32 // On the sparc, the return will use a ld [%l0],%i0 instruction. 33 // However %l0 was clobbered at the end of the catch block. It was 34 // used to do an indirect call. 35 } 36 37 goodTest()38int Foo::goodTest() 39 { 40 int n; 41 42 try { 43 throw int(99); 44 } 45 46 catch (int &i) { 47 n = 16; 48 } 49 50 return n_; 51 // The return will use a ld [%l2],%i0 instruction. Since %l2 52 // contains the "this" pointer this works. 53 } 54 main()55int main() 56 { 57 Foo foo(5); 58 foo.goodTest(); 59 foo.badTest(); 60 61 // the badTest will have failed 62 printf ("PASS\n"); 63 } 64