2004-01-14 David Carlton <carlton@kealia.com>

Change symbols for C++ nested types to contain the fully qualified
	name, if possible.  (At least in the DWARF-2 case.)  Partial fix
	for PR's c++/57, c++/488, c++/539, c++/573, c++/609, c++/832,
	c++/895.
	* c-exp.y: Update copyright:
	(qualified_type): Handle types nested within classes.
	* cp-namespace.c: Update comments.
	(cp_set_block_scope): Delete #if 0.
	(cp_lookup_nested_type): Handle types nested within classes.
	* dwarf2read.c: (scan_partial_symbols): Call add_partial_structure
	when appropriate.
	(add_partial_symbol): Add the name of the enclosing namespace to
	types.
	(pdi_needs_namespace): New.
	(add_partial_namespace): Tweak comment.
	(add_partial_structure): New.
	(psymtab_to_symtab_1): Initialize processing_current_prefix
	here...
	(process_die): instead of here.
	(read_structure_scope): Try to figure out the name of the class or
	namespace that the structure might be defined within.
	(read_enumeration): Generate fully-qualified names, if possible.
	(read_namespace): Don't set name to NULL.
	(die_specification): New.
	(new_symbol): Generate fully-qualified names for types.
	(read_type_die): Determine appropriate prefix.
	(determine_prefix): New.
	(typename_concat): New.
	(class_name): New.
	* valops.c: Update copyright.
	(value_aggregate_elt): Pass NOSIDE to
	value_struct_elt_for_reference.
	(value_struct_elt_for_reference): Make static, add NOSIDE
	parameter, call value_maybe_namespace_elt as a last resort.
	(value_namespace_elt): Break out code into
	value_maybe_namespace_elt.
	(value_maybe_namespace_elt): New.

2004-01-14  David Carlton  <carlton@kealia.com>

	* gdb.cp/namespace.exp: Add tests involving classes defined within
	namespaces.
	* gdb.cp/namespace.cc (C::CClass): New.
	* gdb.cp/namespace1.cc: Update copyright.
	(C::OtherFileClass): New.
This commit is contained in:
David Carlton 2004-01-14 16:54:43 +00:00
parent a51dab8874
commit 63d06c5c42
9 changed files with 605 additions and 94 deletions

View file

@ -32,9 +32,12 @@
#include "dictionary.h"
#include "command.h"
/* When set, the file that we're processing seems to have debugging
info for C++ namespaces, so cp-namespace.c shouldn't try to guess
namespace info itself. */
/* When set, the file that we're processing is known to have debugging
info for C++ namespaces. */
/* NOTE: carlton/2004-01-13: No currently released version of GCC (the
latest of which is 3.3.x at the time of this writing) produces this
debug info. GCC 3.4 should, however. */
unsigned char processing_has_namespace_info;
@ -222,12 +225,6 @@ cp_set_block_scope (const struct symbol *symbol,
if (SYMBOL_CPLUS_DEMANGLED_NAME (symbol) != NULL)
{
#if 0
/* FIXME: carlton/2003-06-12: As mentioned above,
'processing_has_namespace_info' currently isn't entirely
reliable, so let's always use demangled names to get this
information for now. */
if (processing_has_namespace_info)
{
block_set_scope
@ -237,7 +234,6 @@ cp_set_block_scope (const struct symbol *symbol,
obstack);
}
else
#endif
{
/* Try to figure out the appropriate namespace from the
demangled name. */
@ -520,10 +516,6 @@ lookup_symbol_file (const char *name,
class or namespace given by PARENT_TYPE, from within the context
given by BLOCK. Return NULL if there is no such nested type. */
/* FIXME: carlton/2003-09-24: For now, this only works for nested
namespaces; the patch to make this work on other sorts of nested
types is next on my TODO list. */
struct type *
cp_lookup_nested_type (struct type *parent_type,
const char *nested_name,
@ -531,8 +523,16 @@ cp_lookup_nested_type (struct type *parent_type,
{
switch (TYPE_CODE (parent_type))
{
case TYPE_CODE_STRUCT:
case TYPE_CODE_NAMESPACE:
{
/* NOTE: carlton/2003-11-10: We don't treat C++ class members
of classes like, say, data or function members. Instead,
they're just represented by symbols whose names are
qualified by the name of the surrounding class. This is
just like members of namespaces; in particular,
lookup_symbol_namespace works when looking them up. */
const char *parent_name = TYPE_TAG_NAME (parent_type);
struct symbol *sym = cp_lookup_symbol_namespace (parent_name,
nested_name,
@ -547,7 +547,7 @@ cp_lookup_nested_type (struct type *parent_type,
}
default:
internal_error (__FILE__, __LINE__,
"cp_lookup_nested_type called on a non-namespace.");
"cp_lookup_nested_type called on a non-aggregate type.");
}
}