From a9a9bd0f6672cfb4a9131288759bb0dd60ec0738 Mon Sep 17 00:00:00 2001 From: David Carlton Date: Thu, 5 Dec 2002 23:13:47 +0000 Subject: [PATCH] 2002-12-05 David Carlton * dwarf2read.c (dwarf2_add_field): Treat a field that is a DW_TAG_member as well as a declaration as being a C++ static data member. (read_structure_scope): Combine tests for DW_TAG_member and DW_TAG_variable. --- gdb/ChangeLog | 8 ++++++++ gdb/dwarf2read.c | 30 ++++++++++++++++++++---------- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index c6a4850ff0..1b051a120e 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2002-12-05 David Carlton + + * dwarf2read.c (dwarf2_add_field): Treat a field that is a + DW_TAG_member as well as a declaration as being a C++ static data + member. + (read_structure_scope): Combine tests for DW_TAG_member and + DW_TAG_variable. + 2002-12-05 David Carlton * linespec.c (decode_compound): New function. diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 25240d1739..d1a497c33e 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -2146,8 +2146,11 @@ dwarf2_add_field (struct field_info *fip, struct die_info *die, new_field->virtuality = DW_UNSND (attr); fp = &new_field->field; - if (die->tag == DW_TAG_member) + + if (die->tag == DW_TAG_member && ! die_is_declaration (die)) { + /* Data member other than a C++ static data member. */ + /* Get type of field. */ fp->type = die_type (die, objfile, cu_header); @@ -2232,12 +2235,18 @@ dwarf2_add_field (struct field_info *fip, struct die_info *die, fip->non_public_fields = 1; } } - else if (die->tag == DW_TAG_variable) + else if (die->tag == DW_TAG_member || die->tag == DW_TAG_variable) { + /* C++ static member. */ + + /* NOTE: carlton/2002-11-05: It should be a DW_TAG_member that + is a declaration, but all versions of G++ as of this writing + (so through at least 3.2.1) incorrectly generate + DW_TAG_variable tags. */ + char *physname; - /* C++ static member. - Get name of field. */ + /* Get name of field. */ attr = dwarf_attr (die, DW_AT_name); if (attr && DW_STRING (attr)) fieldname = DW_STRING (attr); @@ -2605,13 +2614,14 @@ read_structure_scope (struct die_info *die, struct objfile *objfile, while (child_die && child_die->tag) { - if (child_die->tag == DW_TAG_member) + if (child_die->tag == DW_TAG_member + || child_die->tag == DW_TAG_variable) { - dwarf2_add_field (&fi, child_die, objfile, cu_header); - } - else if (child_die->tag == DW_TAG_variable) - { - /* C++ static member. */ + /* NOTE: carlton/2002-11-05: A C++ static data member + should be a DW_TAG_member that is a declaration, but + all versions of G++ as of this writing (so through at + least 3.2.1) incorrectly generate DW_TAG_variable + tags for them instead. */ dwarf2_add_field (&fi, child_die, objfile, cu_header); } else if (child_die->tag == DW_TAG_subprogram)