diff options
author | David Carlton <carlton@bactrian.org> | 2004-01-14 16:54:43 +0000 |
---|---|---|
committer | David Carlton <carlton@bactrian.org> | 2004-01-14 16:54:43 +0000 |
commit | 63d06c5c42c2367dcafe44679742b5435463418b (patch) | |
tree | 3b8ffe8095efd54a0b6d13ade03177bd8dbcf216 /gdb/valops.c | |
parent | a51dab8874fc8a1775adc510e9f867270966805e (diff) | |
download | gdb-63d06c5c42c2367dcafe44679742b5435463418b.zip gdb-63d06c5c42c2367dcafe44679742b5435463418b.tar.gz gdb-63d06c5c42c2367dcafe44679742b5435463418b.tar.bz2 |
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.
Diffstat (limited to 'gdb/valops.c')
-rw-r--r-- | gdb/valops.c | 67 |
1 files changed, 46 insertions, 21 deletions
diff --git a/gdb/valops.c b/gdb/valops.c index 5f302ca..14fefd9 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -1,6 +1,6 @@ /* Perform non-arithmetic operations on values, for GDB. Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, - 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 + 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. This file is part of GDB. @@ -64,17 +64,21 @@ static struct value *search_struct_method (char *, struct value **, static int check_field_in (struct type *, const char *); - static struct value *value_struct_elt_for_reference (struct type *domain, int offset, struct type *curtype, char *name, - struct type *intype); + struct type *intype, + enum noside noside); static struct value *value_namespace_elt (const struct type *curtype, - const char *name, + char *name, enum noside noside); +static struct value *value_maybe_namespace_elt (const struct type *curtype, + char *name, + enum noside noside); + static CORE_ADDR allocate_space_in_inferior (int); static struct value *cast_into_complex (struct type *, struct value *); @@ -2234,7 +2238,8 @@ value_aggregate_elt (struct type *curtype, { case TYPE_CODE_STRUCT: case TYPE_CODE_UNION: - return value_struct_elt_for_reference (curtype, 0, curtype, name, NULL); + return value_struct_elt_for_reference (curtype, 0, curtype, name, NULL, + noside); case TYPE_CODE_NAMESPACE: return value_namespace_elt (curtype, name, noside); default: @@ -2250,10 +2255,11 @@ value_aggregate_elt (struct type *curtype, "pointers to member functions". This function is used to resolve user expressions of the form "DOMAIN::NAME". */ -struct value * +static struct value * value_struct_elt_for_reference (struct type *domain, int offset, struct type *curtype, char *name, - struct type *intype) + struct type *intype, + enum noside noside) { struct type *t = curtype; int i; @@ -2376,11 +2382,17 @@ value_struct_elt_for_reference (struct type *domain, int offset, offset + base_offset, TYPE_BASECLASS (t, i), name, - intype); + intype, + noside); if (v) return v; } - return 0; + + /* As a last chance, pretend that CURTYPE is a namespace, and look + it up that way; this (frequently) works for types nested inside + classes. */ + + return value_maybe_namespace_elt (curtype, name, noside); } /* C++: Return the member NAME of the namespace given by the type @@ -2388,33 +2400,46 @@ value_struct_elt_for_reference (struct type *domain, int offset, static struct value * value_namespace_elt (const struct type *curtype, - const char *name, + char *name, enum noside noside) { + struct value *retval = value_maybe_namespace_elt (curtype, name, + noside); + + if (retval == NULL) + error ("No symbol \"%s\" in namespace \"%s\".", name, + TYPE_TAG_NAME (curtype)); + + return retval; +} + +/* A helper function used by value_namespace_elt and + value_struct_elt_for_reference. It looks up NAME inside the + context CURTYPE; this works if CURTYPE is a namespace or if CURTYPE + is a class and NAME refers to a type in CURTYPE itself (as opposed + to, say, some base class of CURTYPE). */ + +static struct value * +value_maybe_namespace_elt (const struct type *curtype, + char *name, + enum noside noside) +{ const char *namespace_name = TYPE_TAG_NAME (curtype); struct symbol *sym; - struct value *retval; sym = cp_lookup_symbol_namespace (namespace_name, name, NULL, get_selected_block (0), VAR_DOMAIN, NULL); if (sym == NULL) - retval = NULL; + return NULL; else if ((noside == EVAL_AVOID_SIDE_EFFECTS) && (SYMBOL_CLASS (sym) == LOC_TYPEDEF)) - retval = allocate_value (SYMBOL_TYPE (sym)); + return allocate_value (SYMBOL_TYPE (sym)); else - retval = value_of_variable (sym, get_selected_block (0)); - - if (retval == NULL) - error ("No symbol \"%s\" in namespace \"%s\".", name, - TYPE_TAG_NAME (curtype)); - - return retval; + return value_of_variable (sym, get_selected_block (0)); } - /* Given a pointer value V, find the real (RTTI) type of the object it points to. Other parameters FULL, TOP, USING_ENC as with value_rtti_type() |