/* 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 . */
#include
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
}