aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2008-10-30 21:44:15 +0000
committerTom Tromey <tromey@redhat.com>2008-10-30 21:44:15 +0000
commitf3134b888619774c6511acbf8d978bd7427ce1ad (patch)
treefecd95fd6c571f6a6d6bad373e635a6d9cdb068a
parent724b958c4168d40f59a35112c36ebf9e02c43d56 (diff)
downloadgdb-f3134b888619774c6511acbf8d978bd7427ce1ad.zip
gdb-f3134b888619774c6511acbf8d978bd7427ce1ad.tar.gz
gdb-f3134b888619774c6511acbf8d978bd7427ce1ad.tar.bz2
gdb
* value.c (coerce_array): Use check_typedef. gdb/testsuite * gdb.base/pointers.exp: Add test. * gdb.base/pointers.c (k, S): New typedefs. (instance): New global.
-rw-r--r--gdb/ChangeLog4
-rw-r--r--gdb/testsuite/ChangeLog6
-rw-r--r--gdb/testsuite/gdb.base/pointers.c9
-rw-r--r--gdb/testsuite/gdb.base/pointers.exp4
-rw-r--r--gdb/value.c19
5 files changed, 37 insertions, 5 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 6bb1c9b..00c4fb7 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,7 @@
+2008-10-02 Tom Tromey <tromey@redhat.com>
+
+ * value.c (coerce_array): Use check_typedef.
+
2008-10-28 Tom Tromey <tromey@redhat.com>
* cli/cli-logging.c (handle_redirections): Make a cleanup.
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 9ad4f2d..65966ac 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2008-10-30 Tom Tromey <tromey@redhat.com>
+
+ * gdb.base/pointers.exp: Add test.
+ * gdb.base/pointers.c (k, S): New typedefs.
+ (instance): New global.
+
2008-10-30 Andreas Schwab <schwab@suse.de>
* gdb.base/args.exp: Add tests for newlines.
diff --git a/gdb/testsuite/gdb.base/pointers.c b/gdb/testsuite/gdb.base/pointers.c
index 85bfdc9..4ee5e78 100644
--- a/gdb/testsuite/gdb.base/pointers.c
+++ b/gdb/testsuite/gdb.base/pointers.c
@@ -71,6 +71,15 @@ float ** ptr_to_ptr_to_float;
int y;
+
+typedef long k[5];
+
+typedef struct {
+ k array_variable;
+} S;
+
+S instance;
+
/* Do nothing function used for forcing some of the above variables to
be referenced by the program source. If the variables are not
referenced, some linkers will remove the symbol from the symbol
diff --git a/gdb/testsuite/gdb.base/pointers.exp b/gdb/testsuite/gdb.base/pointers.exp
index 5532140..d7d17e7 100644
--- a/gdb/testsuite/gdb.base/pointers.exp
+++ b/gdb/testsuite/gdb.base/pointers.exp
@@ -596,3 +596,7 @@ gdb_expect {
timeout { fail "(timeout) ptype ppppppC" }
}
+# Regression test for a crash.
+
+gdb_test "p instance.array_variable + 0" \
+ " = \\(long int \\*\\) 0x\[0-9a-f\]*"
diff --git a/gdb/value.c b/gdb/value.c
index 1fa376d..695aa33 100644
--- a/gdb/value.c
+++ b/gdb/value.c
@@ -1728,12 +1728,21 @@ coerce_ref (struct value *arg)
struct value *
coerce_array (struct value *arg)
{
+ struct type *type;
+
arg = coerce_ref (arg);
- if (current_language->c_style_arrays
- && TYPE_CODE (value_type (arg)) == TYPE_CODE_ARRAY)
- arg = value_coerce_array (arg);
- if (TYPE_CODE (value_type (arg)) == TYPE_CODE_FUNC)
- arg = value_coerce_function (arg);
+ type = check_typedef (value_type (arg));
+
+ switch (TYPE_CODE (type))
+ {
+ case TYPE_CODE_ARRAY:
+ if (current_language->c_style_arrays)
+ arg = value_coerce_array (arg);
+ break;
+ case TYPE_CODE_FUNC:
+ arg = value_coerce_function (arg);
+ break;
+ }
return arg;
}