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()21 int 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()38 int 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()55 int 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