This patch fixes a bug on the D demangler by parsing and skip anonymous symbols
correctly, according the ABI specification. Furthermore, it also includes tests
to cover anonymous symbols.

The spec specifies [1] that a symbol name can be anonymous and multiple
anonymous symbols are allowed.

[1]: https://dlang.org/spec/abi.html#SymbolName

ChangeLog:
libiberty/
        * d-demangle.c (dlang_parse_qualified): Handle anonymous symbols
          correctly.

        * testsuite/d-demangle-expected: New tests to cover anonymous symbols.

Signed-off-by: Luís Ferreira <cont...@lsferreira.net>
---
 libiberty/d-demangle.c                  | 13 +++++++++----
 libiberty/testsuite/d-demangle-expected |  8 ++++++++
 2 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/libiberty/d-demangle.c b/libiberty/d-demangle.c
index 3adf7b562d1..682f73f9923 100644
--- a/libiberty/d-demangle.c
+++ b/libiberty/d-demangle.c
@@ -1650,13 +1650,18 @@ dlang_parse_qualified (string *decl, const char 
*mangled,
   size_t n = 0;
   do
     {
+      /* Skip over anonymous symbols.  */
+      if (*mangled == '0')
+      {
+       do mangled++;
+       while (*mangled == '0');
+
+       continue;
+      }
+
       if (n++)
        string_append (decl, ".");
 
-      /* Skip over anonymous symbols.  */
-      while (*mangled == '0')
-       mangled++;
-
       mangled = dlang_identifier (decl, mangled, info);
 
       /* Consume the encoded arguments.  However if this is not followed by the
diff --git a/libiberty/testsuite/d-demangle-expected 
b/libiberty/testsuite/d-demangle-expected
index 44a3649c429..9459f600779 100644
--- a/libiberty/testsuite/d-demangle-expected
+++ b/libiberty/testsuite/d-demangle-expected
@@ -1450,3 +1450,11 @@ mod.func().nested!(int).nested()
 --format=dlang
 _D6mangle__T8fun21753VSQv6S21753S1f_DQBj10__lambda71MFNaNbNiNfZvZQCbQp
 mangle.fun21753!(mangle.S21753(mangle.__lambda71())).fun21753
+#
+--format=dlang
+_D8demangle9anonymous0Z
+demangle.anonymous
+#
+--format=dlang
+_D8demangle9anonymous03fooZ
+demangle.anonymous.foo
-- 
2.33.0

Reply via email to