| /* This testcase is part of GDB, the GNU debugger. | |
| Copyright 2008-2018 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 | |
| } |