Home | History | Annotate | Line # | Download | only in gdb.cp
      1   1.1  christos /* This testcase is part of GDB, the GNU debugger.
      2   1.1  christos 
      3  1.11  christos    Copyright 2008-2024 Free Software Foundation, Inc.
      4   1.1  christos 
      5   1.1  christos    This program is free software; you can redistribute it and/or modify
      6   1.1  christos    it under the terms of the GNU General Public License as published by
      7   1.1  christos    the Free Software Foundation; either version 3 of the License, or
      8   1.1  christos    (at your option) any later version.
      9   1.1  christos 
     10   1.1  christos    This program is distributed in the hope that it will be useful,
     11   1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     12   1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13   1.1  christos    GNU General Public License for more details.
     14   1.1  christos 
     15   1.1  christos    You should have received a copy of the GNU General Public License
     16   1.1  christos    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     17   1.1  christos 
     18   1.1  christos #include <iostream>
     19   1.1  christos 
     20   1.1  christos using namespace std;
     21   1.1  christos 
     22   1.1  christos int dummy ()
     23   1.1  christos {
     24   1.1  christos   return 0;
     25   1.1  christos }
     26   1.1  christos 
     27   1.1  christos class NextOverThrowDerivates
     28   1.1  christos {
     29   1.1  christos 
     30   1.1  christos public:
     31   1.1  christos 
     32   1.1  christos 
     33   1.1  christos   // Single throw an exception in this function.
     34   1.1  christos   void function1 (int val)
     35   1.1  christos   {
     36   1.1  christos     throw val;
     37   1.1  christos   }
     38   1.1  christos 
     39   1.1  christos   // Throw an exception in another function.
     40   1.1  christos   void function2 (int val)
     41   1.1  christos   {
     42   1.1  christos     function1 (val);
     43   1.1  christos   }
     44   1.1  christos 
     45   1.1  christos   // Throw an exception in another function, but handle it
     46   1.1  christos   // locally.
     47   1.1  christos   void function3 (int val)
     48   1.1  christos   {
     49   1.1  christos     {
     50   1.1  christos       try
     51   1.1  christos 	{
     52   1.1  christos 	  function1 (val);
     53   1.1  christos 	}
     54   1.1  christos       catch (...)
     55   1.1  christos 	{
     56   1.1  christos 	  cout << "Caught and handled function1 exception" << endl;
     57   1.1  christos 	}
     58   1.1  christos     }
     59   1.1  christos   }
     60   1.1  christos 
     61   1.1  christos   void rethrow (int val)
     62   1.1  christos   {
     63   1.1  christos     try
     64   1.1  christos       {
     65   1.1  christos 	function1 (val);
     66   1.1  christos       }
     67   1.1  christos     catch (...)
     68   1.1  christos       {
     69   1.1  christos 	throw;
     70   1.1  christos       }
     71   1.1  christos   }
     72   1.1  christos 
     73   1.1  christos   void finish (int val)
     74   1.1  christos   {
     75   1.1  christos     // We use this to test that a "finish" here does not end up in
     76   1.1  christos     // this frame, but in the one above.
     77   1.1  christos     try
     78   1.1  christos       {
     79   1.1  christos 	function1 (val);
     80   1.1  christos       }
     81   1.1  christos     catch (int x)
     82   1.1  christos       {
     83   1.1  christos       }
     84   1.1  christos     function1 (val);		// marker for until
     85   1.1  christos   }
     86   1.1  christos 
     87   1.1  christos   void until (int val)
     88   1.1  christos   {
     89   1.1  christos     function1 (val);
     90   1.1  christos     function1 (val);		// until here
     91   1.1  christos   }
     92   1.1  christos 
     93   1.1  christos   void resumebpt (int val)
     94   1.1  christos   {
     95   1.1  christos     try
     96   1.1  christos       {
     97   1.1  christos 	throw val;
     98   1.1  christos       }
     99   1.1  christos     catch (int x)
    100   1.1  christos       {
    101   1.1  christos 	dummy ();
    102   1.1  christos       }
    103   1.1  christos   }
    104   1.1  christos 
    105   1.1  christos };
    106   1.1  christos NextOverThrowDerivates next_cases;
    107   1.1  christos 
    108   1.1  christos 
    109   1.1  christos int
    110   1.1  christos resumebpt_test (int x)
    111   1.1  christos {
    112   1.1  christos   try
    113   1.1  christos     {
    114   1.1  christos       next_cases.resumebpt (x);	    // Start: resumebpt
    115   1.1  christos       next_cases.resumebpt (x + 1); // Second: resumebpt
    116   1.1  christos     }
    117   1.1  christos   catch (int val)
    118   1.1  christos     {
    119   1.1  christos       dummy ();
    120   1.1  christos       x = val;
    121   1.1  christos     }
    122   1.1  christos 
    123   1.1  christos   return x;
    124   1.1  christos }
    125   1.1  christos 
    126   1.1  christos int main ()
    127   1.1  christos {
    128   1.1  christos   int testval = -1;
    129   1.1  christos 
    130   1.1  christos   try
    131   1.1  christos     {
    132   1.1  christos       next_cases.function1 (0);	// Start: first test
    133   1.1  christos     }
    134   1.1  christos   catch (int val)
    135   1.1  christos     {
    136   1.1  christos       dummy ();
    137   1.1  christos       testval = val;		// End: first test
    138   1.1  christos     }
    139   1.1  christos 
    140   1.1  christos   try
    141   1.1  christos     {
    142   1.1  christos       next_cases.function2 (1);	// Start: nested throw
    143   1.1  christos     }
    144   1.1  christos   catch (int val)
    145   1.1  christos     {
    146   1.1  christos       dummy ();
    147   1.1  christos       testval = val;		// End: nested throw
    148   1.1  christos     }
    149   1.1  christos 
    150   1.1  christos   try
    151   1.1  christos     {
    152   1.1  christos       // This is duplicated so we can next over one but step into
    153   1.1  christos       // another.
    154   1.1  christos       next_cases.function2 (2);	// Start: step in test
    155   1.1  christos     }
    156   1.1  christos   catch (int val)
    157   1.1  christos     {
    158   1.1  christos       dummy ();
    159   1.1  christos       testval = val;		// End: step in test
    160   1.1  christos     }
    161   1.1  christos 
    162   1.1  christos   next_cases.function3 (3);	// Start: next past catch
    163   1.1  christos   dummy ();
    164   1.1  christos   testval = 3;			// End: next past catch
    165   1.1  christos 
    166   1.1  christos   try
    167   1.1  christos     {
    168   1.1  christos       next_cases.rethrow (4);	// Start: rethrow
    169   1.1  christos     }
    170   1.1  christos   catch (int val)
    171   1.1  christos     {
    172   1.1  christos       dummy ();
    173   1.1  christos       testval = val;		// End: rethrow
    174   1.1  christos     }
    175   1.1  christos 
    176   1.1  christos   try
    177   1.1  christos     {
    178   1.1  christos       // Another duplicate so we can test "finish".
    179   1.1  christos       next_cases.function2 (5);	// Start: first finish
    180   1.1  christos     }
    181   1.1  christos   catch (int val)
    182   1.1  christos     {
    183   1.1  christos       dummy ();
    184   1.1  christos       testval = val;		// End: first finish
    185   1.1  christos     }
    186   1.1  christos 
    187   1.1  christos   // Another test for "finish".
    188   1.1  christos   try
    189   1.1  christos     {
    190   1.1  christos       next_cases.finish (6);	// Start: second finish
    191   1.1  christos     }
    192   1.1  christos   catch (int val)
    193   1.1  christos     {
    194   1.1  christos       dummy ();
    195   1.1  christos       testval = val;		// End: second finish
    196   1.1  christos     }
    197   1.1  christos 
    198   1.1  christos   // Test of "until".
    199   1.1  christos   try
    200   1.1  christos     {
    201   1.1  christos       next_cases.finish (7);	// Start: first until
    202   1.1  christos     }
    203   1.1  christos   catch (int val)
    204   1.1  christos     {
    205   1.1  christos       dummy ();
    206   1.1  christos       testval = val;		// End: first until
    207   1.1  christos     }
    208   1.1  christos 
    209   1.1  christos   // Test of "until" with an argument.
    210   1.1  christos   try
    211   1.1  christos     {
    212   1.1  christos       next_cases.until (8);	// Start: second until
    213   1.1  christos     }
    214   1.1  christos   catch (int val)
    215   1.1  christos     {
    216   1.1  christos       dummy ();
    217   1.1  christos       testval = val;		// End: second until
    218   1.1  christos     }
    219   1.1  christos 
    220   1.1  christos   // Test of "advance".
    221   1.1  christos   try
    222   1.1  christos     {
    223   1.1  christos       next_cases.until (9);	// Start: advance
    224   1.1  christos     }
    225   1.1  christos   catch (int val)
    226   1.1  christos     {
    227   1.1  christos       dummy ();
    228   1.1  christos       testval = val;		// End: advance
    229   1.1  christos     }
    230   1.1  christos 
    231   1.1  christos   // Test of "resumebpt".
    232   1.1  christos   testval = resumebpt_test (10);
    233   1.1  christos 
    234   1.1  christos   testval = 32;			// done
    235   1.1  christos }
    236