gdb
authorTom Tromey <tromey@redhat.com>
Thu, 30 Oct 2008 21:44:15 +0000 (21:44 +0000)
committerTom Tromey <tromey@redhat.com>
Thu, 30 Oct 2008 21:44:15 +0000 (21:44 +0000)
* 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.

gdb/ChangeLog
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/pointers.c
gdb/testsuite/gdb.base/pointers.exp
gdb/value.c

index 6bb1c9b..00c4fb7 100644 (file)
@@ -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.
index 9ad4f2d..65966ac 100644 (file)
@@ -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.
index 85bfdc9..4ee5e78 100644 (file)
@@ -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
index 5532140..d7d17e7 100644 (file)
@@ -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\]*"
index 1fa376d..695aa33 100644 (file)
@@ -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;
 }
 \f