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


Ping?

>>>>> 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]