* 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.
This commit is contained in:
Joel Brobecker 2008-01-30 19:23:26 +00:00
parent 4e885b20aa
commit 8d04f9f0c8
7 changed files with 359 additions and 0 deletions

View File

@ -1,3 +1,11 @@
2008-01-30 Paul Hilfinger <hilfinger@adacore.com>
* 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.
2008-01-30 Joel Brobecker <brobecker@adacore.com>
* gdb.base/ptype.exp: Add testing of "ptype $pc".

View File

@ -0,0 +1,102 @@
# 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.
# Note: This test is essentially a transcription of gdb.cp/formatted-ref.exp,
# and is thus much more wordy than it needs to be. There are fewer
# tests because only a few parameter types in Ada are required to be
# passed by reference, and there is no equivalent of &(&x) for reference
# values.
if $tracelevel then {
strace $tracelevel
}
load_lib "ada.exp"
set testdir "formatted_ref"
set testfile "${testdir}/formatted_ref"
set srcfile ${srcdir}/${subdir}/${testfile}.adb
set binfile ${objdir}/${subdir}/${testfile}
file mkdir ${objdir}/${subdir}/${testdir}
if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug ]] != "" } {
untested formatted-ref.exp
return -1
}
proc get_address { var } {
global expect_out
global gdb_prompt
send_gdb "print $var'access\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 val addr } {
global gdb_prompt
set test "print/x $var"
gdb_test_multiple "$test" $test {
-re "\\$\[0-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'access"
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 defs.adb:[gdb_get_line_number "marker here" ${testdir}/defs.adb ]
set s1_address [get_address "s1"]
test_p_x "s" "(x => 0xd, y => 0x13)" $s1_address
test_p_x_addr "s" $s1_address

View File

@ -0,0 +1,23 @@
-- 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/>.
package body Defs is
function F1 (S : Struct1) return Integer is
begin
return s.x; -- Set breakpoint marker here.
end F1;
end Defs;

View File

@ -0,0 +1,27 @@
-- 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/>.
package Defs is
type Struct1 is limited record
X : Integer := 13;
Y : Integer := 19;
end record;
function F1 (S : Struct1) return Integer;
S1 : Struct1;
end Defs;

View File

@ -0,0 +1,21 @@
-- 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/>.
with Defs;
procedure Formatted_Ref is
X : Integer;
begin
X := Defs.F1 (Defs.S1);
end Formatted_Ref;

View File

@ -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);
}

View File

@ -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