d-demangle.c (dlang_identifier): Handle template constraint symbols.
authorIain Buclaw <ibuclaw@gdcproject.org>
Mon, 1 May 2017 10:45:35 +0000 (10:45 +0000)
committerIain Buclaw <ibuclaw@gcc.gnu.org>
Mon, 1 May 2017 10:45:35 +0000 (10:45 +0000)
libiberty/ChangeLog:

* d-demangle.c (dlang_identifier): Handle template constraint symbols.
(dlang_parse_template): Only advance if template symbol prefix is
followed by a digit.
* testsuite/d-demangle-expected: Add tests.

From-SVN: r247433

libiberty/ChangeLog
libiberty/d-demangle.c
libiberty/testsuite/d-demangle-expected

index d4c054ffe832ec609276275664cf64bf8067fc27..7aa4821d61080a80ebcbd759ca14a51eab889c0d 100644 (file)
@@ -1,3 +1,10 @@
+2017-04-15  Iain Buclaw  <ibuclaw@gdcproject.org>
+
+       * d-demangle.c (dlang_identifier): Handle template constraint symbols.
+       (dlang_parse_template): Only advance if template symbol prefix is
+       followed by a digit.
+       * testsuite/d-demangle-expected: Add tests.
+
 2017-05-01  Iain Buclaw  <ibuclaw@gdcproject.org>
 
        * d-demangle.c (dlang_attributes): Handle scope attributes.
index af7c63d10868f24704619f1cc27e746e205a2ce5..74dde9d9b0c79a411dfb41529dde662ac03b172f 100644 (file)
@@ -769,14 +769,9 @@ dlang_identifier (string *decl, const char *mangled,
       mangled = endptr;
 
       /* May be a template instance.  */
-      if (len >= 5 && strncmp (mangled, "__T", 3) == 0)
-       {
-         /* Template symbol.  */
-         if (ISDIGIT (mangled[3]) && mangled[3] != '0')
-           return dlang_parse_template (decl, mangled, len);
-
-         return NULL;
-       }
+      if (len >= 5 && mangled[0] == '_' && mangled[1] == '_'
+         && (mangled[2] == 'T' || mangled[2] == 'U'))
+       return dlang_parse_template (decl, mangled, len);
 
       switch (len)
        {
@@ -1541,11 +1536,14 @@ dlang_parse_template (string *decl, const char *mangled, long len)
 
        TemplateInstanceName:
            Number __T LName TemplateArgs Z
+           Number __U LName TemplateArgs Z
                   ^
      The start pointer should be at the above location, and LEN should be
      the value of the decoded number.
    */
-  if (strncmp (mangled, "__T", 3) != 0)
+
+  /* Template symbol.  */
+  if (!ISDIGIT (mangled[3]) || mangled[3] == '0')
     return NULL;
 
   mangled += 3;
index 57f7c52331b123704fbcec08d5a1dc6318af19fa..6725684ff332f911283b4d5f6cb8427195818e46 100644 (file)
@@ -650,6 +650,10 @@ _D8demangle9__T4testZv
 demangle.test!()
 #
 --format=dlang
+_D8demangle9__U4testZv
+demangle.test!()
+#
+--format=dlang
 _D8demangle11__T4testTaZv
 demangle.test!(char)
 #