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