summaryrefslogtreecommitdiff
path: root/libiberty/d-demangle.c
diff options
context:
space:
mode:
authorIain Buclaw <ibuclaw@gdcproject.org>2017-05-01 10:45:35 +0000
committerIain Buclaw <ibuclaw@gcc.gnu.org>2017-05-01 10:45:35 +0000
commitc6f44bae7e0a338b533e541c8e369b920ffe83f0 (patch)
treed59ae1b5e2dbe768d6d985e73923cf5239fedbbe /libiberty/d-demangle.c
parentec89d258a04492c4b664850b5679dfe7cf247ceb (diff)
d-demangle.c (dlang_identifier): Handle template constraint symbols.
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
Diffstat (limited to 'libiberty/d-demangle.c')
-rw-r--r--libiberty/d-demangle.c16
1 files changed, 7 insertions, 9 deletions
diff --git a/libiberty/d-demangle.c b/libiberty/d-demangle.c
index af7c63d1086..74dde9d9b0c 100644
--- a/libiberty/d-demangle.c
+++ b/libiberty/d-demangle.c
@@ -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;