* ada-lang.c (ada_get_field_index): Add handling of the case
authorJoel Brobecker <brobecker@gnat.com>
Tue, 24 Mar 2009 01:51:48 +0000 (01:51 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Tue, 24 Mar 2009 01:51:48 +0000 (01:51 +0000)
        when TYPE is a typedef of a struct.

gdb/ChangeLog
gdb/ada-lang.c

index 09f157dbf6648c6034a83cb3e8d3206f7657ad08..15350a11efc848887f6f03acd96c2094f6c41c34 100644 (file)
@@ -1,3 +1,8 @@
+2009-03-23  Joel Brobecker  <brobecker@adacore.com>
+
+       * ada-lang.c (ada_get_field_index): Add handling of the case
+       when TYPE is a typedef of a struct.
+
 2009-03-23  Joel Brobecker  <brobecker@adacore.com>
 
        Add gdb_usleep as a portable version of sleep based on gdb_select.
index 080045452942012201073581a61becc85cb3adaa..b4e1eb952c0a1c187462c1c8d860f72f62c26847 100644 (file)
@@ -411,25 +411,28 @@ field_name_match (const char *field_name, const char *target)
 }
 
 
-/* Assuming TYPE is a TYPE_CODE_STRUCT, find the field whose name matches
-   FIELD_NAME, and return its index.  This function also handles fields
-   whose name have ___ suffixes because the compiler sometimes alters
-   their name by adding such a suffix to represent fields with certain
-   constraints.  If the field could not be found, return a negative
-   number if MAYBE_MISSING is set.  Otherwise raise an error.  */
+/* Assuming TYPE is a TYPE_CODE_STRUCT or a TYPE_CODE_TYPDEF to
+   a TYPE_CODE_STRUCT, find the field whose name matches FIELD_NAME,
+   and return its index.  This function also handles fields whose name
+   have ___ suffixes because the compiler sometimes alters their name
+   by adding such a suffix to represent fields with certain constraints.
+   If the field could not be found, return a negative number if
+   MAYBE_MISSING is set.  Otherwise raise an error.  */
 
 int
 ada_get_field_index (const struct type *type, const char *field_name,
                      int maybe_missing)
 {
   int fieldno;
-  for (fieldno = 0; fieldno < TYPE_NFIELDS (type); fieldno++)
-    if (field_name_match (TYPE_FIELD_NAME (type, fieldno), field_name))
+  struct type *struct_type = check_typedef ((struct type *) type);
+
+  for (fieldno = 0; fieldno < TYPE_NFIELDS (struct_type); fieldno++)
+    if (field_name_match (TYPE_FIELD_NAME (struct_type, fieldno), field_name))
       return fieldno;
 
   if (!maybe_missing)
     error (_("Unable to find field %s in struct %s.  Aborting"),
-           field_name, TYPE_NAME (type));
+           field_name, TYPE_NAME (struct_type));
 
   return -1;
 }