new test for EH w/ opt on
authorBrendan Kehoe <brendan@gcc.gnu.org>
Wed, 25 Mar 1998 13:47:06 +0000 (08:47 -0500)
committerBrendan Kehoe <brendan@gcc.gnu.org>
Wed, 25 Mar 1998 13:47:06 +0000 (08:47 -0500)
From-SVN: r18829

gcc/testsuite/g++.old-deja/g++.brendan/eh1.C [new file with mode: 0644]

diff --git a/gcc/testsuite/g++.old-deja/g++.brendan/eh1.C b/gcc/testsuite/g++.old-deja/g++.brendan/eh1.C
new file mode 100644 (file)
index 0000000..a668306
--- /dev/null
@@ -0,0 +1,62 @@
+// Special g++ Options: -O
+// PRMS Id: 10776
+
+extern "C" void printf (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");
+}