OSDN Git Service

2009-03-20 Tom Tromey <tromey@redhat.com>
authorTom Tromey <tromey@redhat.com>
Fri, 20 Mar 2009 22:00:05 +0000 (22:00 +0000)
committerTom Tromey <tromey@redhat.com>
Fri, 20 Mar 2009 22:00:05 +0000 (22:00 +0000)
    Jan Kratochvil  <jan.kratochvil@redhat.com>

* dwarf2read.c (process_die): Handle DW_TAG_typedef.
* eval.c (evaluate_subexp_standard) <OP_TYPE>: Strip a single
typedef.
* ada-lang.c (decode_packed_array_type): Call CHECK_TYPEDEF on the
SYMBOL_TYPE result.
* ada-typeprint.c (print_array_type): Do the NULL check
unconditionally.

gdb/ChangeLog
gdb/ada-lang.c
gdb/ada-typeprint.c
gdb/dwarf2read.c
gdb/eval.c

index 107396e..9d5e5f4 100644 (file)
@@ -1,3 +1,14 @@
+2009-03-20  Tom Tromey  <tromey@redhat.com>
+           Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * dwarf2read.c (process_die): Handle DW_TAG_typedef.
+       * eval.c (evaluate_subexp_standard) <OP_TYPE>: Strip a single
+       typedef.
+       * ada-lang.c (decode_packed_array_type): Call CHECK_TYPEDEF on the
+       SYMBOL_TYPE result.
+       * ada-typeprint.c (print_array_type): Do the NULL check
+       unconditionally.
+
 2009-03-19  Tom Tromey  <tromey@redhat.com>
 
        * utils.c (do_obstack_free): New function.
index b95a303..e4fdd24 100644 (file)
@@ -1783,6 +1783,7 @@ decode_packed_array_type (struct type *type)
       return NULL;
     }
   shadow_type = SYMBOL_TYPE (sym);
+  CHECK_TYPEDEF (shadow_type);
 
   if (TYPE_CODE (shadow_type) != TYPE_CODE_ARRAY)
     {
index f00824a..ef665c4 100644 (file)
@@ -357,16 +357,17 @@ print_array_type (struct type *type, struct ui_file *stream, int show,
   bitsize = 0;
   fprintf_filtered (stream, "array (");
 
+  if (type == NULL)
+    {
+      fprintf_filtered (stream, _("<undecipherable array type>"));
+      return;
+    }
+
   n_indices = -1;
   if (show < 0)
     fprintf_filtered (stream, "...");
   else
     {
-      if (type == NULL)
-        {
-          fprintf_filtered (stream, _("<undecipherable array type>"));
-          return;
-        }
       if (ada_is_simple_array_type (type))
        {
          struct type *range_desc_type =
index feb57b0..cf8f458 100644 (file)
@@ -2849,6 +2849,7 @@ process_die (struct die_info *die, struct dwarf2_cu *cu)
 
     case DW_TAG_base_type:
     case DW_TAG_subrange_type:
+    case DW_TAG_typedef:
       /* Add a typedef symbol for the type definition, if it has a
          DW_AT_name.  */
       new_symbol (die, read_type_die (die, cu), cu);
index 1d35571..cc92ebe 100644 (file)
@@ -2475,7 +2475,17 @@ evaluate_subexp_standard (struct type *expect_type,
       if (noside == EVAL_SKIP)
         goto nosideret;
       else if (noside == EVAL_AVOID_SIDE_EFFECTS)
-        return allocate_value (exp->elts[pc + 1].type);
+       {
+         struct type *type = exp->elts[pc + 1].type;
+         /* If this is a typedef, then find its immediate target.  We
+            use check_typedef to resolve stubs, but we ignore its
+            result because we do not want to dig past all
+            typedefs.  */
+         check_typedef (type);
+         if (TYPE_CODE (type) == TYPE_CODE_TYPEDEF)
+           type = TYPE_TARGET_TYPE (type);
+         return allocate_value (type);
+       }
       else
         error (_("Attempt to use a type name as an expression"));