diff options
-rw-r--r-- | gdb/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/testsuite/gdb.c++/try_catch.cc | 126 | ||||
-rw-r--r-- | gdb/testsuite/gdb.c++/try_catch.exp | 84 |
3 files changed, 216 insertions, 0 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 762fe07..f746075 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,4 +1,10 @@ 2002-05-27 Michael Chastain <mec@shout.net> +From Benjamin Kosnik <bkoz@redhat.com> + + * gdb.c++/try_catch.cc: New file. + * gdb.c++/try_catch.exp: New file. + +2002-05-27 Michael Chastain <mec@shout.net> * gdb.c++/local.exp: Accept more nested types in output. diff --git a/gdb/testsuite/gdb.c++/try_catch.cc b/gdb/testsuite/gdb.c++/try_catch.cc new file mode 100644 index 0000000..9a9c737 --- /dev/null +++ b/gdb/testsuite/gdb.c++/try_catch.cc @@ -0,0 +1,126 @@ +// 2002-05-27 + +#include <exception> +#include <stdexcept> +#include <string> + +namespace __gnu_test +{ + enum region { oriental, egyptian, greek, etruscan, roman }; + + // Test one. + class gnu_obj_1 + { + public: + typedef region antiquities; + const bool test; + const int key1; + long key2; + + antiquities value; + + gnu_obj_1(antiquities a, long l): test(true), key1(5), key2(l), value(a) {} + }; + + // Test two. + template<typename T> + class gnu_obj_2: public virtual gnu_obj_1 + { + public: + antiquities value_derived; + + gnu_obj_2(antiquities b): gnu_obj_1(oriental, 7), value_derived(b) { } + }; + + // Test three. + template<typename T> + class gnu_obj_3 + { + public: + typedef region antiquities; + gnu_obj_2<int> data; + + gnu_obj_3(antiquities b): data(etruscan) { } + }; +} + +int main() +{ + using namespace __gnu_test; + + bool test = true; + const int i = 5; + int j = i; + gnu_obj_2<long> test2(roman); + gnu_obj_3<long> test3(greek); + + // 1 + try + { + ++j; + throw gnu_obj_1(egyptian, 4589); + } + catch (gnu_obj_1& obj) + { + ++j; + if (obj.value != egyptian) + test &= false; + if (obj.key2 != 4589) + test &= false; + } + catch (...) + { + j = 0; + test &= false; + } + + // 2 + try + { + ++j; + try + { + ++j; + try + { + ++j; + throw gnu_obj_1(egyptian, 4589); + } + catch (gnu_obj_1& obj) + { + ++j; + if (obj.value != egyptian) + test &= false; + if (obj.key2 != 4589) + test &= false; + } + } + catch (gnu_obj_1& obj) + { + ++j; + if (obj.value != egyptian) + test &= false; + if (obj.key2 != 4589) + test &= false; + } + } + catch (...) + { + j = 0; + test &= false; + } + + // 3 use standard library + using namespace std; + try + { + if (j < 100) + throw invalid_argument("gdb.1"); + } + catch (exception& obj) + { + if (obj.what() != "gdb.1") + test &= false; + } + return 0; +} diff --git a/gdb/testsuite/gdb.c++/try_catch.exp b/gdb/testsuite/gdb.c++/try_catch.exp new file mode 100644 index 0000000..e024132 --- /dev/null +++ b/gdb/testsuite/gdb.c++/try_catch.exp @@ -0,0 +1,84 @@ +# Copyright 2002 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 2 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Tests for member data +# 2002-05-27 Benjamin Kosnik <bkoz@redhat.com> + +# This file is part of the gdb testsuite + +if $tracelevel then { + strace $tracelevel + } + +if { [skip_cplus_tests] } { continue } + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile "try_catch" +set srcfile ${testfile}.cc +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +if [get_compiler_info ${binfile} "c++"] { + return -1 +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + + +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +# One. + +gdb_test "break 61" "Breakpoint \[0-9\]*.*line 61\\." +gdb_test "continue" "Continuing\\.\r\n\r\nBreakpoint.*at.*try_catch\\.cc:61\r\n.*" "continue to 61" + +gdb_test "break 66" "Breakpoint \[0-9\]*.*line 66\\." +gdb_test "continue" "Continuing\\.\r\n\r\nBreakpoint.*at.*try_catch\\.cc:66\r\n.*" "continue to 66" + +gdb_test "break 80" "Breakpoint \[0-9\]*.*line 80\\." +gdb_test "continue" "Continuing\\.\r\n\r\nBreakpoint.*at.*try_catch\\.cc:80\r\n.*" "continue to 80" + +gdb_test "break 83" "Breakpoint \[0-9\]*.*line 83\\." +gdb_test "continue" "Continuing\\.\r\n\r\nBreakpoint.*at.*try_catch\\.cc:83\r\n.*" "continue to 83" + +gdb_test "break 87" "Breakpoint \[0-9\]*.*line 87\\." +gdb_test "continue" "Continuing\\.\r\n\r\nBreakpoint.*at.*try_catch\\.cc:87\r\n.*" "continue to 87" + +gdb_test "break 92" "Breakpoint \[0-9\]*.*line 92\\." +gdb_test "continue" "Continuing\\.\r\n\r\nBreakpoint.*at.*try_catch\\.cc:92\r\n.*" "continue to 92" + +gdb_test "break 118" "Breakpoint \[0-9\]*.*line 118\\." +gdb_test "continue" "Continuing\\.\r\n\r\nBreakpoint.*at.*try_catch\\.cc:118\r\n.*" "continue to 118" + +gdb_test "break 122" "Breakpoint \[0-9\]*.*line 122\\." +gdb_test "continue" "Continuing\\.\r\n\r\nBreakpoint.*at.*try_catch\\.cc:122\r\n.*" "continue to 122" + +gdb_exit +return 0 |