diff options
author | Tom Tromey <tromey@redhat.com> | 2008-10-30 21:44:15 +0000 |
---|---|---|
committer | Tom Tromey <tromey@redhat.com> | 2008-10-30 21:44:15 +0000 |
commit | f3134b888619774c6511acbf8d978bd7427ce1ad (patch) | |
tree | fecd95fd6c571f6a6d6bad373e635a6d9cdb068a | |
parent | 724b958c4168d40f59a35112c36ebf9e02c43d56 (diff) | |
download | gdb-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/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/pointers.c | 9 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/pointers.exp | 4 | ||||
-rw-r--r-- | gdb/value.c | 19 |
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; } |