Fix for PR 9399 gdb can't call or print a const function that uses virtual inheritance

This commit is contained in:
Chris Moller 2009-12-10 20:57:10 +00:00
parent a0351a698b
commit 191ca0a151
7 changed files with 120 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2009-12-10 Chris Moller <cmoller@redhat.com>
PR gdb/9399
* valops.c (value_cast_structs): Added test to return NULL if no
casting needed.
2009-12-10 Oza Pawandeep <paawan1982@yahoo.com>
* i386-tdep.c: Support for floating point recording.

View File

@ -487,7 +487,7 @@ Randolph Chung tausq@debian.org
Nick Clifton nickc@redhat.com
J.T. Conklin jtc@acorntoolworks.com
Brendan Conoboy blc@redhat.com
Ludovic Courtès ludo@gnu.org
Ludovic Courtès ludo@gnu.org
DJ Delorie dj@redhat.com
Chris Demetriou cgd@google.com
Philippe De Muyter phdm@macqel.be
@ -553,6 +553,7 @@ Mark Mitchell mark@codesourcery.com
Marko Mlinar markom@opencores.org
Alan Modra amodra@bigpond.net.au
Jason Molenda jmolenda@apple.com
Chris Moller cmoller@redhat.com
Phil Muldoon pmuldoon@redhat.com
Pierre Muller muller@sourceware.org
Gaius Mulley gaius@glam.ac.uk

View File

@ -1,3 +1,10 @@
2009-12-10 Chris Moller <moller@mollerware.com>
PR gdb/9399
* gdb.cp/virtfunc2.exp: New tests
* gdb.cp/virtfunc2.cc: New tests
* gdb.cp/Makefile.in: Added tests to EXECUTABLES
2009-12-10 Oza Pawandeep (paawan1982@yahoo.com
* gdb.reverse/i387-env-reverse.c: New file.

View File

@ -4,7 +4,7 @@ srcdir = @srcdir@
EXECUTABLES = ambiguous annota2 anon-union cplusfuncs cttiadd \
derivation inherit local member-ptr method misc \
overload ovldbreak ref-typ ref-typ2 templates userdef virtfunc namespace \
ref-types ref-params method2 pr9594 gdb2495
ref-types ref-params method2 pr9594 gdb2495 virtfunc2
all info install-info dvi install uninstall installcheck check:
@echo "Nothing to be done for $@..."

View File

@ -0,0 +1,40 @@
/* This test script is part of GDB, the GNU debugger.
Copyright 2009
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/>.
*/
class interface
{
virtual int do_print3() { return 111111; }
};
class Obj : virtual public interface
{
public:
virtual int do_print() { return 123456; }
};
class Obj2 : Obj, virtual public interface
{
virtual int do_print2() { return 654321; }
};
int main(int argc, char** argv) {
Obj o;
Obj2 o2;
return 0; // marker 1
}

View File

@ -0,0 +1,59 @@
# Copyright 2009 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/>.
# This file was written by Chris Moller <moller@redhat.com> based on
# virtfunc.exp
set nl "\[\r\n\]+"
if { [skip_cplus_tests] } { continue }
load_lib "cp-support.exp"
set testfile "virtfunc2"
set srcfile ${testfile}.cc
set binfile ${objdir}/${subdir}/${testfile}
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {c++ debug}] != "" } {
untested virtfunc2.exp
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
}
# set a breakpoint at the return stmt
gdb_breakpoint [gdb_get_line_number "marker 1"]
gdb_continue_to_breakpoint "marker 1"
gdb_test "print o.do_print()" "\\$\[0-9\]+ = 123456"
gdb_test "print o.do_print3()" "\\$\[0-9\]+ = 111111"
gdb_test "print o2.do_print()" "\\$\[0-9\]+ = 123456"
gdb_test "print o2.do_print2()" "\\$\[0-9\]+ = 654321"
gdb_test "print o2.do_print3()" "\\$\[0-9\]+ = 111111"
gdb_exit
return 0

View File

@ -232,6 +232,11 @@ value_cast_structs (struct type *type, struct value *v2)
|| TYPE_CODE (t2) == TYPE_CODE_UNION)
&& !!"Precondition is that value is of STRUCT or UNION kind");
if (TYPE_NAME (t1) != NULL
&& TYPE_NAME (t2) != NULL
&& !strcmp (TYPE_NAME (t1), TYPE_NAME (t2)))
return NULL;
/* Upcasting: look in the type of the source to see if it contains the
type of the target as a superclass. If so, we'll need to
offset the pointer rather than just change its type. */