aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/testsuite/ChangeLog9
-rw-r--r--gdb/testsuite/gdb.cp/Makefile.in3
-rw-r--r--gdb/testsuite/gdb.cp/pr10728-x.cc7
-rw-r--r--gdb/testsuite/gdb.cp/pr10728-x.h9
-rw-r--r--gdb/testsuite/gdb.cp/pr10728-y.cc11
-rw-r--r--gdb/testsuite/gdb.cp/pr10728.exp66
-rw-r--r--gdb/valarith.c7
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;
}