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]
Other format: [Raw text]

Patch committed: Correct demangling of qualified function types


PR 48665 points out that qualified function types are not correctly
demangled.  These types can only appear as template parameters.  This
patch fixes the problem.  Bootstrapped and ran C++ testsuite on
x86_64-unknown-linux-gnu.  Committed to mainline.

Ian


2011-10-10  Ian Lance Taylor  <iant@google.com>

	PR c++/48665
	* cp-demangle.c (d_cv_qualifiers): If qualifiers are applied to a
	function type, change them to apply to the "this" parameter.
	* testsuite/demangle-expected: Add test case.


Index: testsuite/demangle-expected
===================================================================
--- testsuite/demangle-expected	(revision 179771)
+++ testsuite/demangle-expected	(working copy)
@@ -4198,3 +4198,8 @@ f1<int>
 _Z3fooi._omp_cpyfn.6
 foo(int) [clone ._omp_cpyfn.6]
 foo
+#
+--format=gnu-v3 --no-params
+_Z1fIKFvvES0_Evv
+void f<void () const, void ()>()
+f<void () const, void ()>
Index: cp-demangle.c
===================================================================
--- cp-demangle.c	(revision 179771)
+++ cp-demangle.c	(working copy)
@@ -2294,8 +2294,10 @@ static struct demangle_component **
 d_cv_qualifiers (struct d_info *di,
                  struct demangle_component **pret, int member_fn)
 {
+  struct demangle_component **pstart;
   char peek;
 
+  pstart = pret;
   peek = d_peek_char (di);
   while (peek == 'r' || peek == 'V' || peek == 'K')
     {
@@ -2332,6 +2334,28 @@ d_cv_qualifiers (struct d_info *di,
       peek = d_peek_char (di);
     }
 
+  if (!member_fn && peek == 'F')
+    {
+      while (pstart != pret)
+	{
+	  switch ((*pstart)->type)
+	    {
+	    case DEMANGLE_COMPONENT_RESTRICT:
+	      (*pstart)->type = DEMANGLE_COMPONENT_RESTRICT_THIS;
+	      break;
+	    case DEMANGLE_COMPONENT_VOLATILE:
+	      (*pstart)->type = DEMANGLE_COMPONENT_VOLATILE_THIS;
+	      break;
+	    case DEMANGLE_COMPONENT_CONST:
+	      (*pstart)->type = DEMANGLE_COMPONENT_CONST_THIS;
+	      break;
+	    default:
+	      break;
+	    }
+	  pstart = &d_left (*pstart);
+	}
+    }
+
   return pret;
 }
 

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