* ada-lang.c (decode_packed_array_type): Avoid a seg fault
authorJoel Brobecker <brobecker@gnat.com>
Fri, 4 Jan 2008 20:45:05 +0000 (20:45 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Fri, 4 Jan 2008 20:45:05 +0000 (20:45 +0000)
        when the type is an anonymous pointer type.
        (ada_check_typedef): Avoid a seg fault when the type is null.
        * ada-typeprint.c (print_array_type): Add support for pointer
        to packed arrays.

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

index ccc112fa0803749ba0422c427bf92c91220f5477..699a553e2610d932066f3ccdd39611bf3e5c92f8 100644 (file)
@@ -1,3 +1,11 @@
+2008-01-04  Jerome Guitton  <guitton@adacore.com>
+
+       * ada-lang.c (decode_packed_array_type): Avoid a seg fault
+       when the type is an anonymous pointer type.
+       (ada_check_typedef): Avoid a seg fault when the type is null.
+       * ada-typeprint.c (print_array_type): Add support for pointer
+       to packed arrays.
+
 2008-01-04  Paul N. Hilfinger  <hilfinger@adacore.com>
 
         * ada-exp.y: Allow '{type} ADDRESS' notation on left of assignment.
index 134244f1d31195bbbaafdf168fae03d3e7bb36c5..198ef62c72041844a86c901cda072cc35e50a8a3 100644 (file)
@@ -1809,13 +1809,21 @@ decode_packed_array_type (struct type *type)
 {
   struct symbol *sym;
   struct block **blocks;
-  const char *raw_name = ada_type_name (ada_check_typedef (type));
-  char *name = (char *) alloca (strlen (raw_name) + 1);
-  char *tail = strstr (raw_name, "___XP");
+  char *raw_name = ada_type_name (ada_check_typedef (type));
+  char *name;
+  char *tail;
   struct type *shadow_type;
   long bits;
   int i, n;
 
+  if (!raw_name)
+    raw_name = ada_type_name (desc_base_type (type));
+
+  if (!raw_name)
+    return NULL;
+
+  name = (char *) alloca (strlen (raw_name) + 1);
+  tail = strstr (raw_name, "___XP");
   type = desc_base_type (type);
 
   memcpy (name, raw_name, tail - raw_name);
@@ -7269,6 +7277,9 @@ static_unwrap_type (struct type *type)
 struct type *
 ada_check_typedef (struct type *type)
 {
+  if (type == NULL)
+    return NULL;
+
   CHECK_TYPEDEF (type);
   if (type == NULL || TYPE_CODE (type) != TYPE_CODE_ENUM
       || !TYPE_STUB (type)
index 7bfb001b7bc585f8223588afd3a4df3eed1fa6ae..4b1f9ffc90d90b84bcb571f41ecff7f0cd15de43 100644 (file)
@@ -366,6 +366,9 @@ print_array_type (struct type *type, struct ui_file *stream, int show,
   int bitsize;
   int n_indices;
 
+  if (ada_is_packed_array_type (type))
+    type = ada_coerce_to_simple_array_type (type);
+
   bitsize = 0;
   fprintf_filtered (stream, "array (");
 
@@ -374,8 +377,6 @@ print_array_type (struct type *type, struct ui_file *stream, int show,
     fprintf_filtered (stream, "...");
   else
     {
-      if (ada_is_packed_array_type (type))
-       type = ada_coerce_to_simple_array_type (type);
       if (type == NULL)
         {
           fprintf_filtered (stream, _("<undecipherable array type>"));
@@ -782,7 +783,17 @@ ada_print_type (struct type *type0, char *varstring, struct ui_file *stream,
   if (ada_is_aligner_type (type))
     ada_print_type (ada_aligned_type (type), "", stream, show, level);
   else if (ada_is_packed_array_type (type))
-    print_array_type (type, stream, show, level);
+    {
+      if (TYPE_CODE (type) == TYPE_CODE_PTR)
+        {
+          fprintf_filtered (stream, "access ");
+          print_array_type (TYPE_TARGET_TYPE (type), stream, show, level);
+        }
+      else
+        {
+          print_array_type (type, stream, show, level);
+        }
+    }
   else
     switch (TYPE_CODE (type))
       {