ChangeLog:

* dwarf2read.c (dwarf2_name): Work around GCC bugzilla debug/41828 by
	ignoring spurious DW_AT_name attributes for unnamed structs or unions.
	* completer.c (add_struct_fields): Fix inverted logic.

testsuite/ChangeLog:

	* gdb.cp/inherit.exp (test_ptype_si): XFAIL test for GCC versions
	that do not provide the tagless_struct type name at all.
	(test_print_anon_union): Do not check value of uninitialized
	union member.  Do not use cp_test_ptype_class, so we can accept
	"long" as well as "long int".
This commit is contained in:
Ulrich Weigand 2010-03-26 18:05:46 +00:00
parent dde2d684b0
commit 907af001f7
5 changed files with 55 additions and 24 deletions

View File

@ -1,3 +1,9 @@
2010-03-26 Ulrich Weigand <uweigand@de.ibm.com>
* dwarf2read.c (dwarf2_name): Work around GCC bugzilla debug/41828 by
ignoring spurious DW_AT_name attributes for unnamed structs or unions.
* completer.c (add_struct_fields): Fix inverted logic.
2010-03-26 Ulrich Weigand <uweigand@de.ibm.com>
* breakpoint.c (bpstat_clear_actions): Reset bs->commands_left.

View File

@ -401,7 +401,7 @@ add_struct_fields (struct type *type, int *nextp, char **output,
computed_type_name = 1;
}
/* Omit constructors from the completion list. */
if (type_name && strcmp (type_name, name))
if (!type_name || strcmp (type_name, name))
{
output[*nextp] = xstrdup (name);
++*nextp;

View File

@ -9187,6 +9187,7 @@ dwarf2_name (struct die_info *die, struct dwarf2_cu *cu)
/* These tags always have simple identifiers already; no need
to canonicalize them. */
return DW_STRING (attr);
case DW_TAG_subprogram:
/* Java constructors will all be named "<init>", so return
the class name when we see this special case. */
@ -9214,17 +9215,33 @@ dwarf2_name (struct die_info *die, struct dwarf2_cu *cu)
}
while (die->tag != DW_TAG_compile_unit);
}
/* fall through */
break;
case DW_TAG_class_type:
case DW_TAG_interface_type:
case DW_TAG_structure_type:
case DW_TAG_union_type:
/* Some GCC versions emit spurious DW_AT_name attributes for unnamed
structures or unions. These were of the form "._%d" in GCC 4.1,
or simply "<anonymous struct>" or "<anonymous union>" in GCC 4.3
and GCC 4.4. We work around this problem by ignoring these. */
if (strncmp (DW_STRING (attr), "._", 2) == 0
|| strncmp (DW_STRING (attr), "<anonymous", 10) == 0)
return NULL;
break;
default:
if (!DW_STRING_IS_CANONICAL (attr))
{
DW_STRING (attr)
= dwarf2_canonicalize_name (DW_STRING (attr), cu,
&cu->objfile->objfile_obstack);
DW_STRING_IS_CANONICAL (attr) = 1;
}
return DW_STRING (attr);
break;
}
if (!DW_STRING_IS_CANONICAL (attr))
{
DW_STRING (attr)
= dwarf2_canonicalize_name (DW_STRING (attr), cu,
&cu->objfile->objfile_obstack);
DW_STRING_IS_CANONICAL (attr) = 1;
}
return DW_STRING (attr);
}
/* Return the die that this die in an extension of, or NULL if there

View File

@ -1,3 +1,11 @@
2010-03-26 Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
* gdb.cp/inherit.exp (test_ptype_si): XFAIL test for GCC versions
that do not provide the tagless_struct type name at all.
(test_print_anon_union): Do not check value of uninitialized
union member. Do not use cp_test_ptype_class, so we can accept
"long" as well as "long int".
2010-03-26 Pedro Alves <pedro@codesourcery.com>
* gdb.trace/tfile.c (tohex, bin2hex): New.

View File

@ -114,6 +114,11 @@ proc test_ptype_si { } {
# gcc 3.4.1 -gstabs+
pass "$name"
}
-re "No symbol \"tagless_struct\" in current context.$nl$gdb_prompt $" {
# Several GCC 4.x versions provide neither a DW_TAG_typedef DIE
# nor use the typedef name as struct tag name.
xfail "$name"
}
}
set name "ptype variable of type tagless struct"
@ -490,25 +495,20 @@ proc test_print_anon_union {} {
set name "print variable of type anonymous union"
gdb_test_multiple "print g_anon_union" $name {
-re "$vhn = \{one = 1, \{a = 2, b = 2\}\}$nl$gdb_prompt $" {
-re "$vhn = \{one = 1, \{a = 2, b = \[0-9\]+\}\}$nl$gdb_prompt $" {
pass $name
}
}
# The nested union prints as a multi-line field, but the class body
# scanner is inherently line-oriented. This is ugly but it works.
cp_test_ptype_class \
"ptype g_anon_union" "print type of anonymous union" \
"class" "class_with_anon_union" \
{
{ field public "int one;" }
{ field public "union \{" }
{ field public "int a;" }
{ field public "long int b;" }
{ field public "\};" }
set name "print type of anonymous union"
set re_tag "class_with_anon_union"
set re_class "(class $re_tag \{${ws}public:|struct $re_tag\{)"
set re_fields "int one;${ws}union \{${ws}int a;${ws}long( int)? b;${ws}\};"
gdb_test_multiple "ptype g_anon_union" $name {
-re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
pass $name
}
}
}