* NEWS: Add entry.
* dwarf2read.c (dwarf2_add_field): If DW_AT_const_value is present,
create a symbol for the field and record the value.
(new_symbol): Handle DW_TAG_member.
* gdbtypes.c (field_is_static): Remove FIXME.
* symtab.c (search_symbols): When searching for VARIABLES_DOMAIN,
only ignore LOC_CONST symbols that are enums.
testsuite/
Test PR c++/11702.
* gdb.cp/m-static.exp: Add testcase.
* gdb.cp/m-static.h (gnu_obj_4): Add initialized static const member.
2010-06-29 Doug Evans <dje@google.com>
2010-06-29 Doug Evans <dje@google.com>
+ PR gdb/11702
+ * NEWS: Add entry.
+ * dwarf2read.c (dwarf2_add_field): If DW_AT_const_value is present,
+ create a symbol for the field and record the value.
+ (new_symbol): Handle DW_TAG_member.
+ * gdbtypes.c (field_is_static): Remove FIXME.
+ * symtab.c (search_symbols): When searching for VARIABLES_DOMAIN,
+ only ignore LOC_CONST symbols that are enums.
+
* dwarf2read.c: Remove trailing whitespace.
Delete FIELD_LOC_KIND_DWARF_BLOCK, unused.
* dwarf2read.c: Remove trailing whitespace.
Delete FIELD_LOC_KIND_DWARF_BLOCK, unused.
GDB now also supports proper overload resolution for all the previously
mentioned flavors of operators.
GDB now also supports proper overload resolution for all the previously
mentioned flavors of operators.
+ ** static const class members
+
+ Printing of static const class members that are initialized in the
+ class definition has been fixed.
+
* Windows Thread Information Block access.
On Windows targets, GDB now supports displaying the Windows Thread
* Windows Thread Information Block access.
On Windows targets, GDB now supports displaying the Windows Thread
+ /* NOTE: According to the dwarf standard, static data members are
+ indicated by having DW_AT_external.
+ The check here for ! die_is_declaration is historical.
+ This test is replicated in new_symbol. */
+
if (die->tag == DW_TAG_member && ! die_is_declaration (die, cu))
{
/* Data member other than a C++ static data member. */
if (die->tag == DW_TAG_member && ! die_is_declaration (die, cu))
{
/* Data member other than a C++ static data member. */
if (fieldname == NULL)
return;
if (fieldname == NULL)
return;
+ attr = dwarf2_attr (die, DW_AT_const_value, cu);
+ if (attr)
+ {
+ /* A static const member, not much different than an enum as far as
+ we're concerned, except that we can support more types. */
+ new_symbol (die, NULL, cu);
+ }
+
/* Get physical name. */
physname = (char *) dwarf2_physname (fieldname, die, cu);
/* Get physical name. */
physname = (char *) dwarf2_physname (fieldname, die, cu);
BLOCK_FUNCTION from the blockvector. */
break;
case DW_TAG_variable:
BLOCK_FUNCTION from the blockvector. */
break;
case DW_TAG_variable:
/* Compilation with minimal debug info may result in variables
with missing type entries. Change the misleading `void' type
to something sensible. */
/* Compilation with minimal debug info may result in variables
with missing type entries. Change the misleading `void' type
to something sensible. */
= objfile_type (objfile)->nodebug_data_symbol;
attr = dwarf2_attr (die, DW_AT_const_value, cu);
= objfile_type (objfile)->nodebug_data_symbol;
attr = dwarf2_attr (die, DW_AT_const_value, cu);
+ /* In the case of DW_TAG_member, we should only be called for
+ static const members. */
+ if (die->tag == DW_TAG_member)
+ {
+ /* NOTE: This test seems wrong according to the dwarf standard.
+ static data members are represented by DW_AT_external.
+ However, dwarf2_add_field is currently calling
+ die_is_declaration to check, so we do the same. */
+ gdb_assert (die_is_declaration (die, cu));
+ gdb_assert (attr);
+ }
if (attr)
{
dwarf2_const_value (attr, sym, cu);
if (attr)
{
dwarf2_const_value (attr, sym, cu);
to the address of the enclosing struct. It would be nice to
have a dedicated flag that would be set for static fields when
the type is being created. But in practice, checking the field
to the address of the enclosing struct. It would be nice to
have a dedicated flag that would be set for static fields when
the type is being created. But in practice, checking the field
- loc_kind should give us an accurate answer (at least as long as
- we assume that DWARF block locations are not going to be used
- for static fields). FIXME? */
+ loc_kind should give us an accurate answer. */
return (FIELD_LOC_KIND (*f) == FIELD_LOC_KIND_PHYSNAME
|| FIELD_LOC_KIND (*f) == FIELD_LOC_KIND_PHYSADDR);
}
return (FIELD_LOC_KIND (*f) == FIELD_LOC_KIND_PHYSNAME
|| FIELD_LOC_KIND (*f) == FIELD_LOC_KIND_PHYSADDR);
}
if (file_matches (real_symtab->filename, files, nfiles)
&& ((regexp == NULL
|| re_exec (SYMBOL_NATURAL_NAME (sym)) != 0)
if (file_matches (real_symtab->filename, files, nfiles)
&& ((regexp == NULL
|| re_exec (SYMBOL_NATURAL_NAME (sym)) != 0)
- && ((kind == VARIABLES_DOMAIN && SYMBOL_CLASS (sym) != LOC_TYPEDEF
+ && ((kind == VARIABLES_DOMAIN
+ && SYMBOL_CLASS (sym) != LOC_TYPEDEF
&& SYMBOL_CLASS (sym) != LOC_UNRESOLVED
&& SYMBOL_CLASS (sym) != LOC_BLOCK
&& SYMBOL_CLASS (sym) != LOC_UNRESOLVED
&& SYMBOL_CLASS (sym) != LOC_BLOCK
- && SYMBOL_CLASS (sym) != LOC_CONST)
+ /* LOC_CONST can be used for more than just enums,
+ e.g., c++ static const members.
+ We only want to skip enums here. */
+ && !(SYMBOL_CLASS (sym) == LOC_CONST
+ && TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_ENUM))
|| (kind == FUNCTIONS_DOMAIN && SYMBOL_CLASS (sym) == LOC_BLOCK)
|| (kind == TYPES_DOMAIN && SYMBOL_CLASS (sym) == LOC_TYPEDEF))))
{
|| (kind == FUNCTIONS_DOMAIN && SYMBOL_CLASS (sym) == LOC_BLOCK)
|| (kind == TYPES_DOMAIN && SYMBOL_CLASS (sym) == LOC_TYPEDEF))))
{
+2010-06-29 Doug Evans <dje@google.com>
+
+ Test PR c++/11702.
+ * gdb.cp/m-static.exp: Add testcase.
+ * gdb.cp/m-static.h (gnu_obj_4): Add initialized static const member.
+
2010-06-28 Phil Muldoon <pmuldoon@redhat.com>
Tom Tromey <tromey@redhat.com>
Thiago Jung Bauermann <bauerman@br.ibm.com>
2010-06-28 Phil Muldoon <pmuldoon@redhat.com>
Tom Tromey <tromey@redhat.com>
Thiago Jung Bauermann <bauerman@br.ibm.com>
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}
if ![runto_main] then {
perror "couldn't run to breakpoint"
continue
}
if ![runto_main] then {
perror "couldn't run to breakpoint"
continue
}
+get_debug_format
+set non_dwarf [expr ! [test_debug_format "DWARF 2"]]
+
# First, run to after we've constructed all the objects:
gdb_breakpoint [gdb_get_line_number "constructs-done"]
# First, run to after we've constructed all the objects:
gdb_breakpoint [gdb_get_line_number "constructs-done"]
# static const int that nobody initializes. From PR gdb/635.
gdb_test "print test4.nowhere" "field nowhere is nonexistent or has been optimized out" "static const int initialized nowhere"
# static const int that nobody initializes. From PR gdb/635.
gdb_test "print test4.nowhere" "field nowhere is nonexistent or has been optimized out" "static const int initialized nowhere"
+# static const initialized in the class definition, PR gdb/11702.
+if { $non_dwarf } { setup_xfail *-*-* }
+gdb_test "print test4.everywhere" "\\$\[0-9\].* = 317" "static const int initialized in class definition"
+if { $non_dwarf } { setup_xfail *-*-* }
+gdb_test "print test4.somewhere" "\\$\[0-9\].* = 3.14\[0-9\]*" "static const float initialized in class definition"
+
+# Also make sure static const members can be found via "info var".
+if { $non_dwarf } { setup_xfail *-*-* }
+gdb_test "info variable everywhere" "File .*/m-static\[.\]h.*const int gnu_obj_4::everywhere;" "info variable everywhere"
+
# Perhaps at some point test4 should also include a test for a static
# const int that was initialized in the header file. But I'm not sure
# that GDB's current behavior in such situations is either consistent
# Perhaps at some point test4 should also include a test for a static
# const int that was initialized in the header file. But I'm not sure
# that GDB's current behavior in such situations is either consistent
public:
static const int elsewhere;
static const int nowhere;
public:
static const int elsewhere;
static const int nowhere;
- // At some point, perhaps:
- // static const int everywhere = 317;
+ static const int everywhere = 317;
+ static const float somewhere = 3.14159;
// try to ensure test4 is actually allocated
int dummy;
// try to ensure test4 is actually allocated
int dummy;