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