gdb
authorTom Tromey <tromey@redhat.com>
Thu, 30 Sep 2010 17:51:39 +0000 (17:51 +0000)
committerTom Tromey <tromey@redhat.com>
Thu, 30 Sep 2010 17:51:39 +0000 (17:51 +0000)
* completer.c (count_struct_fields): Handle anonymous structs and
unions.
(add_struct_fields): Likewise.
gdb/testsuite
* gdb.base/completion.exp: Test completion through anonymous
union.
* gdb.base/break1.c (struct some_struct): Add anonymous union.

gdb/ChangeLog
gdb/completer.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/break1.c
gdb/testsuite/gdb.base/completion.exp

index c10ed117f6408e63f16b0dd2d97ad740346174f3..dfbae8b08b1e11904f51e74d9975f0e31206c10e 100644 (file)
@@ -1,3 +1,9 @@
+2010-09-30  Tom Tromey  <tromey@redhat.com>
+
+       * completer.c (count_struct_fields): Handle anonymous structs and
+       unions.
+       (add_struct_fields): Likewise.
+
 2010-09-30  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        Fix printing parameters of inlined functions.
index 91b899d900fb0488fad55416d76c37998bfb4851..5d0898d04c53ac881a55e7aac00f763301426a48 100644 (file)
@@ -351,7 +351,15 @@ count_struct_fields (struct type *type)
       if (i < TYPE_N_BASECLASSES (type))
        result += count_struct_fields (TYPE_BASECLASS (type, i));
       else if (TYPE_FIELD_NAME (type, i))
-       ++result;
+       {
+         if (TYPE_FIELD_NAME (type, i)[0] != '\0')
+           ++result;
+         else if (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) == TYPE_CODE_UNION)
+           {
+             /* Recurse into anonymous unions.  */
+             result += count_struct_fields (TYPE_FIELD_TYPE (type, i));
+           }
+       }
     }
 
   for (i = TYPE_NFN_FIELDS (type) - 1; i >= 0; --i)
@@ -380,11 +388,22 @@ add_struct_fields (struct type *type, int *nextp, char **output,
       if (i < TYPE_N_BASECLASSES (type))
        add_struct_fields (TYPE_BASECLASS (type, i), nextp, output,
                           fieldname, namelen);
-      else if (TYPE_FIELD_NAME (type, i)
-              && ! strncmp (TYPE_FIELD_NAME (type, i), fieldname, namelen))
+      else if (TYPE_FIELD_NAME (type, i))
        {
-         output[*nextp] = xstrdup (TYPE_FIELD_NAME (type, i));
-         ++*nextp;
+         if (TYPE_FIELD_NAME (type, i)[0] != '\0')
+           {
+             if (! strncmp (TYPE_FIELD_NAME (type, i), fieldname, namelen))
+               {
+                 output[*nextp] = xstrdup (TYPE_FIELD_NAME (type, i));
+                 ++*nextp;
+               }
+           }
+         else if (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) == TYPE_CODE_UNION)
+           {
+             /* Recurse into anonymous unions.  */
+             add_struct_fields (TYPE_FIELD_TYPE (type, i), nextp, output,
+                                fieldname, namelen);
+           }
        }
     }
 
index 42e7192109322fbc398aa5c3c6fe4db57c822958..56ee414d82131f2ace885d90fed1493344efc65d 100644 (file)
@@ -1,3 +1,9 @@
+2010-09-30  Tom Tromey  <tromey@redhat.com>
+
+       * gdb.base/completion.exp: Test completion through anonymous
+       union.
+       * gdb.base/break1.c (struct some_struct): Add anonymous union.
+
 2010-09-30  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        Fix printing parameters of inlined functions.
index 93b563a2933a3e98df9a4b804838ddc27a8173b5..ab8e00f64da00b9d246690a9983973535d214778 100644 (file)
@@ -24,6 +24,7 @@ struct some_struct
 {
   int a_field;
   int b_field;
+  union { int z_field; };
 };
 
 struct some_struct values[50];
index 1f7c214a6f59dc69b2659c7fe0f4acb85bc829f8..904ee9852bdeb1aa514aac98027c85369f9c4ba7 100644 (file)
@@ -684,6 +684,10 @@ gdb_expect  {
         timeout         { fail "(timeout) complete 'p &values\[0\] -> a' 2" }
         }
 
+gdb_test "complete p &values\[0\]->z" \
+    "p &values.0.->z_field" \
+    "copmletion of field in anonymous union"
+
 # The following tests used to simply try to complete `${objdir}/file',
 # and so on.  The problem is that ${objdir} can be very long; the
 # completed filename may be more than eighty characters wide.  When