This is the mail archive of the gdb-patches@sourceware.cygnus.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: Patch to C++ nested class printing


Jason Merrill wrote:
> 
> Ping?

Pong :-(

I'll be checking this in monday.

	Andrew

> 
> >>>>> Jason Merrill <jason@cygnus.com> writes:
> 
>  > 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 == ':')

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]