// { dg-do run } // { dg-options "-O" } // PRMS Id: 10776 extern "C" int printf (const char *, ...); class Foo { public: Foo(int n) : n_(n) { } int f() { return n_; } int badTest(); int goodTest(); private: int n_; }; int Foo::badTest() { try { throw int(99); } catch (int &i) { n_ = 16; } return n_; // On the sparc, the return will use a ld [%l0],%i0 instruction. // However %l0 was clobbered at the end of the catch block. It was // used to do an indirect call. } int Foo::goodTest() { int n; try { throw int(99); } catch (int &i) { n = 16; } return n_; // The return will use a ld [%l2],%i0 instruction. Since %l2 // contains the "this" pointer this works. } int main() { Foo foo(5); foo.goodTest(); foo.badTest(); // the badTest will have failed printf ("PASS\n"); }