Patch to C++ nested class printing
Jason Merrill
jason@cygnus.com
Wed Nov 24 01:47:00 GMT 1999
Currently, printing of methods which take arguments of nested class type
(often, methods of nested classes themselves) is badly broken; for
instance, in gdb.c++/local.cc,
(gdb) ptype InnerLocal
type = class InnerLocal {
public:
char ilc;
int *ip;
NestedInnerLocal nest1;
InnerLocal & InnerLocal const &); <-- should be "operator="
InnerLocal const &); <-- should be a constructor
InnerLocal(void);
int il_foo(unsigned char const &);
}
This happens because the demangled name is
main.1::InnerLocal::operator=(main.1::InnerLocal const &);
and c_type_print_base blithely strips away everything up to the last ::,
including the name of the method. Oops. This patch causes us to stop at
the (.
1999-11-24 Jason Merrill <jason@casey.cygnus.com>
* c-typeprint.c (c_type_print_base): Only strip the initial
Class:: qualification.
Index: c-typeprint.c
===================================================================
RCS file: /cvs/cvsfiles/devo/gdb/c-typeprint.c,v
retrieving revision 2.39
diff -c -p -r2.39 c-typeprint.c
*** c-typeprint.c 1999/07/07 23:51:03 2.39
--- c-typeprint.c 1999/11/24 09:38:13
*************** c_type_print_base (type, stream, show, l
*** 923,932 ****
}
else
{
! char *p;
char *demangled_no_class = demangled_name;
! while ((p = strchr (demangled_no_class, ':')))
{
demangled_no_class = p;
if (*++demangled_no_class == ':')
--- 923,939 ----
}
else
{
! char *p, *q;
char *demangled_no_class = demangled_name;
! /* Only strip the initial Class:: qualification;
! if we don't stop at the (, we end up throwing
! away the name of the function. */
! q = strchr (demangled_name, '(');
! if (q == NULL)
! q = demangled_name + strlen (demangled_name);
! while ((p = strchr (demangled_no_class, ':'))
! && p < q)
{
demangled_no_class = p;
if (*++demangled_no_class == ':')
More information about the Gdb-patches
mailing list