diff options
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/completer.c | 29 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/break1.c | 1 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/completion.exp | 4 |
5 files changed, 41 insertions, 5 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index c10ed11..dfbae8b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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. diff --git a/gdb/completer.c b/gdb/completer.c index 91b899d..5d0898d 100644 --- a/gdb/completer.c +++ b/gdb/completer.c @@ -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); + } } } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 42e7192..56ee414 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -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. diff --git a/gdb/testsuite/gdb.base/break1.c b/gdb/testsuite/gdb.base/break1.c index 93b563a..ab8e00f 100644 --- a/gdb/testsuite/gdb.base/break1.c +++ b/gdb/testsuite/gdb.base/break1.c @@ -24,6 +24,7 @@ struct some_struct { int a_field; int b_field; + union { int z_field; }; }; struct some_struct values[50]; diff --git a/gdb/testsuite/gdb.base/completion.exp b/gdb/testsuite/gdb.base/completion.exp index 1f7c214..904ee98 100644 --- a/gdb/testsuite/gdb.base/completion.exp +++ b/gdb/testsuite/gdb.base/completion.exp @@ -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 |