This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


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

C++ patch for name-demangling



Now that we don't crash wehn compiling templates with
pointer-to-member parameters, we must demangle them.

-- 
Mark Mitchell                   mark@codesourcery.com
CodeSourcery, LLC               http://www.codesourcery.com

1999-04-11  Mark Mitchell  <mark@codesourcery.com>

	* cplus-dem.c (demangle_template_value_parm): Handle
	pointers-to-members.
	(do_type): Handle template parameters as qualifiers.

Index: libiberty/testsuite/demangle-expected
===================================================================
RCS file: /egcs/carton/cvsfiles/egcs/libiberty/testsuite/demangle-expected,v
retrieving revision 1.1
diff -c -p -r1.1 demangle-expected
*** demangle-expected	1999/04/05 14:28:59	1.1
--- demangle-expected	1999/04/12 01:38:17
*************** basic_string<char,string_char_traits<cha
*** 2466,2468 ****
--- 2466,2472 ----
  
  _Utf390_1__1_9223372036854775807__9223372036854775
  _Utf390_1__1_9223372036854775807__9223372036854775
+ #
+ --format=gnu
+ call__H1Z4Test_RX01_t1C2ZX01PMX01FPX01i_vQ2X016output
+ C<Test, Test::output> call<Test>(Test &)
Index: libiberty/cplus-dem.c
===================================================================
RCS file: /egcs/carton/cvsfiles/egcs/libiberty/cplus-dem.c,v
retrieving revision 1.41
diff -c -p -r1.41 cplus-dem.c
*** cplus-dem.c	1999/04/09 09:01:35	1.41
--- cplus-dem.c	1999/04/12 01:38:16
*************** demangle_template_value_parm (work, mang
*** 1505,1540 ****
      }
    else if (tk == tk_pointer || tk == tk_reference)
      {
!       int symbol_len = consume_count (mangled);
!       if (symbol_len == -1)
! 	return -1;
!       if (symbol_len == 0)
! 	string_appendn (s, "0", 1);
        else
  	{
! 	  char *p = xmalloc (symbol_len + 1), *q;
! 	  strncpy (p, *mangled, symbol_len);
! 	  p [symbol_len] = '\0';
! 	  /* We use cplus_demangle here, rather than
! 	     internal_cplus_demangle, because the name of the entity
! 	     mangled here does not make use of any of the squangling
! 	     or type-code information we have built up thus far; it is
! 	     mangled independently.  */
! 	  q = cplus_demangle (p, work->options);
! 	  if (tk == tk_pointer)
! 	    string_appendn (s, "&", 1);
! 	  /* FIXME: Pointer-to-member constants should get a
! 	            qualifying class name here.  */
! 	  if (q)
  	    {
! 	      string_append (s, q);
! 	      free (q);
  	    }
! 	  else
! 	    string_append (s, p);
! 	  free (p);
  	}
-       *mangled += symbol_len;
      }
  
    return success;
--- 1505,1547 ----
      }
    else if (tk == tk_pointer || tk == tk_reference)
      {
!       if (**mangled == 'Q')
! 	success = demangle_qualified (work, mangled, s,
! 				      /*isfuncname=*/0, 
! 				      /*append=*/1);
        else
  	{
! 	  int symbol_len  = consume_count (mangled);
! 	  if (symbol_len == -1)
! 	    return -1;
! 	  if (symbol_len == 0)
! 	    string_appendn (s, "0", 1);
! 	  else
  	    {
! 	      char *p = xmalloc (symbol_len + 1), *q;
! 	      strncpy (p, *mangled, symbol_len);
! 	      p [symbol_len] = '\0';
! 	      /* We use cplus_demangle here, rather than
! 		 internal_cplus_demangle, because the name of the entity
! 		 mangled here does not make use of any of the squangling
! 		 or type-code information we have built up thus far; it is
! 		 mangled independently.  */
! 	      q = cplus_demangle (p, work->options);
! 	      if (tk == tk_pointer)
! 		string_appendn (s, "&", 1);
! 	      /* FIXME: Pointer-to-member constants should get a
! 		 qualifying class name here.  */
! 	      if (q)
! 		{
! 		  string_append (s, q);
! 		  free (q);
! 		}
! 	      else
! 		string_append (s, p);
! 	      free (p);
  	    }
! 	  *mangled += symbol_len;
  	}
      }
  
    return success;
*************** do_type (work, mangled, result)
*** 3040,3050 ****
  
  	    member = **mangled == 'M';
  	    (*mangled)++;
- 	    if (!isdigit ((unsigned char)**mangled) && **mangled != 't')
- 	      {
- 		success = 0;
- 		break;
- 	      }
  
  	    string_append (&decl, ")");
  	    string_prepend (&decl, SCOPE_STRING (work));
--- 3047,3052 ----
*************** do_type (work, mangled, result)
*** 3060,3068 ****
  		string_prependn (&decl, *mangled, n);
  		*mangled += n;
  	      }
! 	    else
  	      {
  		string temp;
  		string_init (&temp);
  		success = demangle_template (work, mangled, &temp,
  					     NULL, 1, 1);
--- 3062,3076 ----
  		string_prependn (&decl, *mangled, n);
  		*mangled += n;
  	      }
! 	    else if (**mangled == 'X' || **mangled == 'Y')
  	      {
  		string temp;
+ 		do_type (work, mangled, &temp);
+ 		string_prepends (&decl, &temp);
+ 	      }
+ 	    else if (**mangled == 't')
+ 	      {
+ 		string temp;
  		string_init (&temp);
  		success = demangle_template (work, mangled, &temp,
  					     NULL, 1, 1);
*************** do_type (work, mangled, result)
*** 3074,3079 ****
--- 3082,3093 ----
  		else
  		  break;
  	      }
+ 	    else
+ 	      {
+ 		success = 0;
+ 		break;
+ 	      }
+ 
  	    string_prepend (&decl, "(");
  	    if (member)
  	      {


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