gdb
* 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.
This commit is contained in:
parent
e7390eec2e
commit
9ae8282da7
5 changed files with 41 additions and 5 deletions
|
@ -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>
|
2010-09-30 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
|
||||||
Fix printing parameters of inlined functions.
|
Fix printing parameters of inlined functions.
|
||||||
|
|
|
@ -351,7 +351,15 @@ count_struct_fields (struct type *type)
|
||||||
if (i < TYPE_N_BASECLASSES (type))
|
if (i < TYPE_N_BASECLASSES (type))
|
||||||
result += count_struct_fields (TYPE_BASECLASS (type, i));
|
result += count_struct_fields (TYPE_BASECLASS (type, i));
|
||||||
else if (TYPE_FIELD_NAME (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)
|
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))
|
if (i < TYPE_N_BASECLASSES (type))
|
||||||
add_struct_fields (TYPE_BASECLASS (type, i), nextp, output,
|
add_struct_fields (TYPE_BASECLASS (type, i), nextp, output,
|
||||||
fieldname, namelen);
|
fieldname, namelen);
|
||||||
else if (TYPE_FIELD_NAME (type, i)
|
else if (TYPE_FIELD_NAME (type, i))
|
||||||
&& ! strncmp (TYPE_FIELD_NAME (type, i), fieldname, namelen))
|
|
||||||
{
|
{
|
||||||
output[*nextp] = xstrdup (TYPE_FIELD_NAME (type, i));
|
if (TYPE_FIELD_NAME (type, i)[0] != '\0')
|
||||||
++*nextp;
|
{
|
||||||
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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>
|
2010-09-30 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
|
||||||
Fix printing parameters of inlined functions.
|
Fix printing parameters of inlined functions.
|
||||||
|
|
|
@ -24,6 +24,7 @@ struct some_struct
|
||||||
{
|
{
|
||||||
int a_field;
|
int a_field;
|
||||||
int b_field;
|
int b_field;
|
||||||
|
union { int z_field; };
|
||||||
};
|
};
|
||||||
|
|
||||||
struct some_struct values[50];
|
struct some_struct values[50];
|
||||||
|
|
|
@ -684,6 +684,10 @@ gdb_expect {
|
||||||
timeout { fail "(timeout) complete 'p &values\[0\] -> a' 2" }
|
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',
|
# The following tests used to simply try to complete `${objdir}/file',
|
||||||
# and so on. The problem is that ${objdir} can be very long; the
|
# and so on. The problem is that ${objdir} can be very long; the
|
||||||
# completed filename may be more than eighty characters wide. When
|
# completed filename may be more than eighty characters wide. When
|
||||||
|
|
Loading…
Reference in a new issue