diff options
author | Joel Brobecker <brobecker@gnat.com> | 2008-01-30 19:23:26 +0000 |
---|---|---|
committer | Joel Brobecker <brobecker@gnat.com> | 2008-01-30 19:23:26 +0000 |
commit | 8d04f9f0c8553ad4f04e419bbd180a583af2cdc7 (patch) | |
tree | 4175339b8f92591f23ab70312ef1c8a1f4c48d42 /gdb/testsuite/gdb.cp | |
parent | 4e885b20aacc9b21d958151311268682822a6069 (diff) | |
download | gdb-8d04f9f0c8553ad4f04e419bbd180a583af2cdc7.zip gdb-8d04f9f0c8553ad4f04e419bbd180a583af2cdc7.tar.gz gdb-8d04f9f0c8553ad4f04e419bbd180a583af2cdc7.tar.bz2 |
* gdb.ada/formatted_ref: New test program.
* gdb.ada/formatted_ref.exp: New testcase.
* gdb.cp/formatted-ref.cc: New file.
* gdb.cp/formatted-ref.exp: New testcase.
Diffstat (limited to 'gdb/testsuite/gdb.cp')
-rw-r--r-- | gdb/testsuite/gdb.cp/formatted-ref.cc | 48 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/formatted-ref.exp | 130 |
2 files changed, 178 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.cp/formatted-ref.cc b/gdb/testsuite/gdb.cp/formatted-ref.cc new file mode 100644 index 0000000..857c3ce --- /dev/null +++ b/gdb/testsuite/gdb.cp/formatted-ref.cc @@ -0,0 +1,48 @@ +/* Copyright 2007, 2008 Free Software Foundation, Inc. + + This file is part of GDB. + + 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/>. */ + +/* Author: Paul N. Hilfinger, AdaCore Inc. */ + +enum Enum1 { Val10=10, Val11, Val12 }; + +struct Struct1 +{ + int x, y; +}; + +int f1 (Struct1& s, Enum1& e, int& i) +{ + return s.x; /* Set breakpoint marker here. */ +} + +Struct1 s1 = { 13, 19 }; + +int i1 = 23; + +Enum1 e1 = Val11; + +int main(void) +{ + + #ifdef usestubs + set_debug_traps(); + breakpoint(); + #endif + + f1 (s1, e1, i1); + +} diff --git a/gdb/testsuite/gdb.cp/formatted-ref.exp b/gdb/testsuite/gdb.cp/formatted-ref.exp new file mode 100644 index 0000000..f9c8ad3 --- /dev/null +++ b/gdb/testsuite/gdb.cp/formatted-ref.exp @@ -0,0 +1,130 @@ +# Copyright 2007, 2008 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/>. + +# Author: P. N. Hilfinger, AdaCore, Inc. + +# This test checks the behavior of formatted print when applied to a +# reference value. The intended behavior is that a formatted print of +# such a value should display the same value as a plain print, +# modulo format, of course. Older versions of GDB would instead print +# the reference's address value itself when doing a formatted print, +# rather than printing both that and the dereferenced value. We also +# check that the (non-standard) expression &(&x), where x is of type T&, +# yields an appropriate value. + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +if { [skip_cplus_tests] } { continue } + +set testfile "formatted-ref" +set srcfile ${testfile}.cc +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { + untested formatted-ref.exp + return -1 +} + +proc get_address { var } { + global expect_out + global gdb_prompt + + send_gdb "print &$var\n" + gdb_expect { + -re "\\$\[0-9\]+ = \\(.*\\) (0x\[0-9a-f\]+).*$gdb_prompt $" { + return $expect_out(1,string) + } + timeout { + perror "couldn't find address of $var" + return "" + } + } +} + +proc test_p_x { var type val addr } { + global gdb_prompt + + set test "print/x $var" + gdb_test_multiple $test $test { + -re "\\$\[0-9\]+ = \\([string_to_regexp $type]\\) @0x\[a-f0-9\]+: [string_to_regexp $val].*$gdb_prompt $" { + pass $test + } + -re "\\$\[0-9\]+ = $addr.*$gdb_prompt $" { + fail "$test (prints just address)" + } + -re "\\$\[0-9\]+ = 0x\[a-f0-9\]+.*$gdb_prompt $" { + fail "$test (prints unexpected address)" + } + } + return 0 +} + +proc test_p_x_addr { var addr } { + global gdb_prompt + + set test "print/x &$var" + gdb_test_multiple $test $test { + -re "\\$\[0-9\]+ = $addr.*$gdb_prompt $" { + pass $test + } + -re "\\$\[0-9\]+ = 0x\[a-f0-9+\]+.*$gdb_prompt $" { + fail "$test (prints unexpected address)" + } + } + return 0 +} + +proc test_p_x_ref_addr { var addr } { + global gdb_prompt + + set test "print/x *(&(&$var))" + gdb_test_multiple $test $test { + -re "\\$\[0-9\]+ = $addr.*$gdb_prompt $" { + pass $test + } + -re "\\$\[0-9\]+ = 0x\[a-f0-9+\]+.*$gdb_prompt $" { + fail "$test (prints unexpected address)" + } + } + return 0 +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +runto ${srcfile}:[gdb_get_line_number "marker here"] + +set s1_address [get_address "s1"] +set e1_address [get_address "e1"] +set i1_address [get_address "i1"] + +test_p_x "s" "Struct1 &" "{x = 0xd, y = 0x13}" $s1_address +test_p_x "e" "Enum1 &" "0xb" $e1_address +test_p_x "i" "int &" "0x17" $i1_address + +test_p_x_addr "s" $s1_address +test_p_x_addr "e" $e1_address +test_p_x_addr "i" $i1_address + +test_p_x_ref_addr "s" $s1_address +test_p_x_ref_addr "i" $i1_address +test_p_x_ref_addr "e" $e1_address |