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