diff options
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 9 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/Makefile.in | 3 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/pr10728-x.cc | 7 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/pr10728-x.h | 9 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/pr10728-y.cc | 11 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/pr10728.exp | 66 | ||||
-rw-r--r-- | gdb/valarith.c | 7 |
8 files changed, 117 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index e4ac3b4..b5e75e0 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +Mon Feb 8 13:17:10 2010 Chris Moller <moller@mollerware.com> + + PR gdb/10728 + * valarith.c (value_ptrdiff): Added a test for a zero type length, + warn if found, and assume length = 1. + 2010-02-08 Chris Moller <cmoller@redhat.com> PR gdb/9067 diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index d121ff2..ccdc8ef 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,12 @@ +Mon Feb 8 13:18:22 2010 Chris Moller <moller@mollerware.com> + + PR gdb/10728 + * gdb.cp/pr10728-x.h: New file. + * gdb.cp/pr10728-x.cc: New file. + * gdb.cp/pr10728-y.cc: New file. + * gdb.cp/pr10728.exp: New file. + * gdb.cp/Makefile.in (EXECUTABLES): Add pr10728 + Mon Feb 8 12:54:54 2010 Chris Moller <moller@mollerware.com> PR gdb/9067 diff --git a/gdb/testsuite/gdb.cp/Makefile.in b/gdb/testsuite/gdb.cp/Makefile.in index aa91583..d78258e 100644 --- a/gdb/testsuite/gdb.cp/Makefile.in +++ b/gdb/testsuite/gdb.cp/Makefile.in @@ -4,7 +4,8 @@ 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 virtfunc2 pr9067 + ref-types ref-params method2 pr9594 gdb2495 virtfunc2 pr9067 \ + pr1072 all info install-info dvi install uninstall installcheck check: @echo "Nothing to be done for $@..." diff --git a/gdb/testsuite/gdb.cp/pr10728-x.cc b/gdb/testsuite/gdb.cp/pr10728-x.cc new file mode 100644 index 0000000..7623c0b --- /dev/null +++ b/gdb/testsuite/gdb.cp/pr10728-x.cc @@ -0,0 +1,7 @@ +#include "pr10728-x.h" + +int main() +{ + X* x = y(); + return 0; // marker 1 +} diff --git a/gdb/testsuite/gdb.cp/pr10728-x.h b/gdb/testsuite/gdb.cp/pr10728-x.h new file mode 100644 index 0000000..63737d9 --- /dev/null +++ b/gdb/testsuite/gdb.cp/pr10728-x.h @@ -0,0 +1,9 @@ +struct Y; +struct X +{ + Y* y1; + Y* y2; +}; + +X* y(); + diff --git a/gdb/testsuite/gdb.cp/pr10728-y.cc b/gdb/testsuite/gdb.cp/pr10728-y.cc new file mode 100644 index 0000000..84b222d --- /dev/null +++ b/gdb/testsuite/gdb.cp/pr10728-y.cc @@ -0,0 +1,11 @@ +#include "pr10728-x.h" +struct Y{}; + +X* y() +{ + static X xx; + static Y yy; + xx.y1 = &yy; + xx.y2 = xx.y1+1; + return &xx; +} diff --git a/gdb/testsuite/gdb.cp/pr10728.exp b/gdb/testsuite/gdb.cp/pr10728.exp new file mode 100644 index 0000000..7ad1bc7 --- /dev/null +++ b/gdb/testsuite/gdb.cp/pr10728.exp @@ -0,0 +1,66 @@ +# Copyright 2010 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 is part of the gdb testsuite + +set nl "\[\r\n\]+" + +if { [skip_cplus_tests] } { continue } + +load_lib "cp-support.exp" + +set testfile "pr10728" +set srcfile ${testfile}-x.cc +set tfx ${testfile}-x +set tfy ${testfile}-y +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${tfy}.cc" "${tfy}.o" object {c++}] != "" } { + untested pr10728.exp + return -1 +} + +if { [gdb_compile "${srcdir}/${subdir}/${tfx}.cc" "${tfx}.o" object {debug c++}] != "" } { + untested pr10728.exp + return -1 +} + +if { [gdb_compile "${tfx}.o ${tfy}.o" ${binfile} executable {debug c++}] != "" } { + untested pr10728.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 x->y2 - x->y1" "warning: Type size unknown, assuming 1\. Try casting to a known type, or void \*\.\[^=\]*= 1" + +gdb_exit +return 0 + + diff --git a/gdb/valarith.c b/gdb/valarith.c index ed76b09..c87bc6f 100644 --- a/gdb/valarith.c +++ b/gdb/valarith.c @@ -122,6 +122,13 @@ First argument of `-' is a pointer and second argument is neither\n\ an integer nor a pointer of the same type.")); sz = TYPE_LENGTH (check_typedef (TYPE_TARGET_TYPE (type1))); + if (sz == 0) + { + warning (_("Type size unknown, assuming 1. " + "Try casting to a known type, or void *.")); + sz = 1; + } + return (value_as_long (arg1) - value_as_long (arg2)) / sz; } |