summaryrefslogtreecommitdiff
path: root/gdb/dwarf2read.c
diff options
context:
space:
mode:
authorDavid Carlton <carlton@bactrian.org>2004-03-16 22:43:15 +0000
committerDavid Carlton <carlton@bactrian.org>2004-03-16 22:43:15 +0000
commite8fb410a513c14ce248a96436579a0cf84cff079 (patch)
tree0bf8181f15fc7ed50341df98f5c9601c47ea1825 /gdb/dwarf2read.c
parent57075668961ca6ffc5675cff8da045ff974aa7cc (diff)
downloadgdb-e8fb410a513c14ce248a96436579a0cf84cff079.tar.gz
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.c36
1 files changed, 19 insertions, 17 deletions
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index c3453ae081c..285eb6bd7aa 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;
}