OSDN Git Service

Merge branch 'binutils' into tmp
[pf3gnuchains/pf3gnuchains4x.git] / gdb / testsuite / gdb.cp / nextoverthrow.cc
diff --git a/gdb/testsuite/gdb.cp/nextoverthrow.cc b/gdb/testsuite/gdb.cp/nextoverthrow.cc
new file mode 100644 (file)
index 0000000..b2a0b20
--- /dev/null
@@ -0,0 +1,235 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2008-2012 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+   */
+#include <iostream>
+
+using namespace std;
+
+int dummy ()
+{
+  return 0;
+}
+
+class NextOverThrowDerivates
+{
+
+public:
+
+
+  // Single throw an exception in this function.
+  void function1 (int val)
+  {
+    throw val;
+  }
+
+  // Throw an exception in another function.
+  void function2 (int val)
+  {
+    function1 (val);
+  }
+
+  // Throw an exception in another function, but handle it
+  // locally.
+  void function3 (int val)
+  {
+    {
+      try
+       {
+         function1 (val);
+       }
+      catch (...) 
+       {
+         cout << "Caught and handled function1 exception" << endl;
+       }
+    }
+  }
+
+  void rethrow (int val)
+  {
+    try
+      {
+       function1 (val);
+      }
+    catch (...)
+      {
+       throw;
+      }
+  }
+
+  void finish (int val)
+  {
+    // We use this to test that a "finish" here does not end up in
+    // this frame, but in the one above.
+    try
+      {
+       function1 (val);
+      }
+    catch (int x)
+      {
+      }
+    function1 (val);           // marker for until
+  }
+
+  void until (int val)
+  {
+    function1 (val);
+    function1 (val);           // until here
+  }
+
+  void resumebpt (int val)
+  {
+    try
+      {
+       throw val;
+      }
+    catch (int x)
+      {
+       dummy ();
+      }
+  }
+
+};
+NextOverThrowDerivates next_cases;
+
+
+int
+resumebpt_test (int x)
+{
+  try
+    {
+      next_cases.resumebpt (x);            // Start: resumebpt
+      next_cases.resumebpt (x + 1); // Second: resumebpt
+    }
+  catch (int val)
+    {
+      dummy ();
+      x = val;
+    }
+
+  return x;
+}
+
+int main () 
+{ 
+  int testval = -1;
+
+  try
+    {
+      next_cases.function1 (0);        // Start: first test
+    }
+  catch (int val)
+    {
+      dummy ();
+      testval = val;           // End: first test
+    }
+
+  try
+    {
+      next_cases.function2 (1);        // Start: nested throw
+    }
+  catch (int val)
+    {
+      dummy ();
+      testval = val;           // End: nested throw
+    }
+
+  try
+    {
+      // This is duplicated so we can next over one but step into
+      // another.
+      next_cases.function2 (2);        // Start: step in test
+    }
+  catch (int val)
+    {
+      dummy ();
+      testval = val;           // End: step in test
+    }
+
+  next_cases.function3 (3);    // Start: next past catch
+  dummy ();
+  testval = 3;                 // End: next past catch
+
+  try
+    {
+      next_cases.rethrow (4);  // Start: rethrow
+    }
+  catch (int val)
+    {
+      dummy ();
+      testval = val;           // End: rethrow
+    }
+
+  try
+    {
+      // Another duplicate so we can test "finish".
+      next_cases.function2 (5);        // Start: first finish
+    }
+  catch (int val)
+    {
+      dummy ();
+      testval = val;           // End: first finish
+    }
+
+  // Another test for "finish".
+  try
+    {
+      next_cases.finish (6);   // Start: second finish
+    }
+  catch (int val)
+    {
+      dummy ();
+      testval = val;           // End: second finish
+    }
+
+  // Test of "until".
+  try
+    {
+      next_cases.finish (7);   // Start: first until
+    }
+  catch (int val)
+    {
+      dummy ();
+      testval = val;           // End: first until
+    }
+
+  // Test of "until" with an argument.
+  try
+    {
+      next_cases.until (8);    // Start: second until
+    }
+  catch (int val)
+    {
+      dummy ();
+      testval = val;           // End: second until
+    }
+
+  // Test of "advance".
+  try
+    {
+      next_cases.until (9);    // Start: advance
+    }
+  catch (int val)
+    {
+      dummy ();
+      testval = val;           // End: advance
+    }
+
+  // Test of "resumebpt".
+  testval = resumebpt_test (10);
+
+  testval = 32;                        // done
+}