diff options
author | David Carlton <carlton@bactrian.org> | 2004-03-16 22:43:15 +0000 |
---|---|---|
committer | David Carlton <carlton@bactrian.org> | 2004-03-16 22:43:15 +0000 |
commit | 90aeadfcc303595a71f885305570da90f25c04a9 (patch) | |
tree | 8b1b0d8c28d993060455b832713cff54a5092143 /gdb/dwarf2read.c | |
parent | 947f426e273a237459d307c06aacedaa219054c3 (diff) | |
download | gdb-90aeadfcc303595a71f885305570da90f25c04a9.zip gdb-90aeadfcc303595a71f885305570da90f25c04a9.tar.gz gdb-90aeadfcc303595a71f885305570da90f25c04a9.tar.bz2 |
2004-03-16 David Carlton <carlton@kealia.com>
* dwarf2read.c (process_structure_scope): Process children even
when we're a declaration.
Diffstat (limited to 'gdb/dwarf2read.c')
-rw-r--r-- | gdb/dwarf2read.c | 36 |
1 files changed, 19 insertions, 17 deletions
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index c3453ae..285eb6b 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -3331,33 +3331,35 @@ process_structure_scope (struct die_info *die, struct dwarf2_cu *cu) { struct objfile *objfile = cu->objfile; const char *previous_prefix = processing_current_prefix; + struct die_info *child_die = die->child; if (TYPE_TAG_NAME (die->type) != NULL) processing_current_prefix = TYPE_TAG_NAME (die->type); - if (die->child != NULL && ! die_is_declaration (die, cu)) - { - struct die_info *child_die; - - child_die = die->child; + /* NOTE: carlton/2004-03-16: GCC 3.4 (or at least one of its + snapshots) has been known to create a die giving a declaration + for a class that has, as a child, a die giving a definition for a + nested class. So we have to process our children even if the + current die is a declaration. Normally, of course, a declaration + won't have any children at all. */ - while (child_die && child_die->tag) + while (child_die != NULL && child_die->tag) + { + if (child_die->tag == DW_TAG_member + || child_die->tag == DW_TAG_variable + || child_die->tag == DW_TAG_inheritance) { - if (child_die->tag == DW_TAG_member - || child_die->tag == DW_TAG_variable - || child_die->tag == DW_TAG_inheritance) - { - /* Do nothing. */ - } - else - process_die (child_die, cu); - - child_die = sibling_die (child_die); + /* Do nothing. */ } + else + process_die (child_die, cu); - new_symbol (die, die->type, cu); + child_die = sibling_die (child_die); } + if (die->child != NULL && ! die_is_declaration (die, cu)) + new_symbol (die, die->type, cu); + processing_current_prefix = previous_prefix; } |