From 83b10087f47feb355bbdc02f8fcd336c0bf000aa Mon Sep 17 00:00:00 2001 From: Chris Moller Date: Mon, 8 Feb 2010 18:27:53 +0000 Subject: [PATCH] PR gdb/10728 * valarith.c (value_ptrdiff): Added a test for a zero type length, warn if found, and assume length = 1. * 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 --- gdb/ChangeLog | 6 +++ gdb/testsuite/ChangeLog | 9 +++++ gdb/testsuite/gdb.cp/Makefile.in | 3 +- gdb/testsuite/gdb.cp/pr10728-x.cc | 7 ++++ gdb/testsuite/gdb.cp/pr10728-x.h | 9 +++++ gdb/testsuite/gdb.cp/pr10728-y.cc | 11 ++++++ gdb/testsuite/gdb.cp/pr10728.exp | 66 +++++++++++++++++++++++++++++++ gdb/valarith.c | 7 ++++ 8 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 gdb/testsuite/gdb.cp/pr10728-x.cc create mode 100644 gdb/testsuite/gdb.cp/pr10728-x.h create mode 100644 gdb/testsuite/gdb.cp/pr10728-y.cc create mode 100644 gdb/testsuite/gdb.cp/pr10728.exp diff --git a/gdb/ChangeLog b/gdb/ChangeLog index e4ac3b4acfb..b5e75e08e35 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +Mon Feb 8 13:17:10 2010 Chris Moller + + 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 PR gdb/9067 diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index d121ff2f35c..ccdc8ef8bae 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,12 @@ +Mon Feb 8 13:18:22 2010 Chris Moller + + 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 PR gdb/9067 diff --git a/gdb/testsuite/gdb.cp/Makefile.in b/gdb/testsuite/gdb.cp/Makefile.in index aa9158377bb..d78258ea756 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 00000000000..7623c0be028 --- /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 00000000000..63737d9bf65 --- /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 00000000000..84b222d712d --- /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 00000000000..7ad1bc739ed --- /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 . + +# 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 ed76b0960ba..c87bc6f255e 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; } -- 2.30.2