Adds support for DMGL_RET_POSTFIX in D demangler, so it shows the type
of the declared variable, or function return type. Postfix notation is
used with space.

libiberty/ChangeLog:

* d-demangle.c: Add DMGL_RET_POSTFIX support.
* testsuite/d-demangle-expected: Add new tests.

Signed-off-by: Witold Baryluk <witold.bary...@gmail.com>
---
 libiberty/ChangeLog                     |  5 ++
 libiberty/d-demangle.c                  | 18 +++++-
 libiberty/testsuite/d-demangle-expected | 84 +++++++++++++++++++++++++
 3 files changed, 104 insertions(+), 3 deletions(-)

diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog
index 45dcc6d61..32cc8ff23 100644
--- a/libiberty/ChangeLog
+++ b/libiberty/ChangeLog
@@ -1,3 +1,8 @@
+2020-05-15  Witold Baryluk  <witold.bary...@gmail.com>
+
+       * d-demangle.c: Add DMGL_RET_POSTFIX support.
+       * testsuite/d-demangle-expected: Add new tests.
+
 2020-05-15  Iain Buclaw  <ibuc...@gdcproject.org>
 
        * d-demangle.c (dlang_attributes): Add @live attribute.
diff --git a/libiberty/d-demangle.c b/libiberty/d-demangle.c
index f2d6946ec..318c21c8d 100644
--- a/libiberty/d-demangle.c
+++ b/libiberty/d-demangle.c
@@ -167,6 +167,8 @@ struct dlang_info
   const char *s;
   /* The index of the last back reference.  */
   int last_backref;
+  /* Demangler options passed to dlang_demangle.  */
+  int option;
 };
 
 /* Pass as the LEN to dlang_parse_template if symbol length is not known.  */
@@ -1553,6 +1555,15 @@ dlang_parse_mangle (string *decl, const char *mangled, 
struct dlang_info *info)
 
          string_init (&type);
          mangled = dlang_type (&type, mangled, info);
+
+         /* If requested return the return type of a function or type of
+            a variable in postfix notation with space as separator.  */
+         if ((info->option & DMGL_RET_POSTFIX) != 0)
+           {
+             string_append (decl, " ");
+             string_appendn (decl, type.b, string_length (&type));
+           }
+
          string_delete (&type);
        }
     }
@@ -1860,17 +1871,18 @@ dlang_parse_template (string *decl, const char *mangled,
 /* Initialize the information structure we use to pass around information.  */
 static void
 dlang_demangle_init_info (const char *mangled, int last_backref,
-                         struct dlang_info *info)
+                         int option, struct dlang_info *info)
 {
   info->s = mangled;
   info->last_backref = last_backref;
+  info->option = option;
 }
 
 /* Extract and demangle the symbol in MANGLED.  Returns the demangled
    signature on success or NULL on failure.  */
 
 char *
-dlang_demangle (const char *mangled, int option ATTRIBUTE_UNUSED)
+dlang_demangle (const char *mangled, int option)
 {
   string decl;
   char *demangled = NULL;
@@ -1891,7 +1903,7 @@ dlang_demangle (const char *mangled, int option 
ATTRIBUTE_UNUSED)
     {
       struct dlang_info info;
 
-      dlang_demangle_init_info (mangled, strlen (mangled), &info);
+      dlang_demangle_init_info (mangled, strlen (mangled), option, &info);
       mangled = dlang_parse_mangle (&decl, mangled, &info);
 
       /* Check that the entire symbol was successfully demangled.  */
diff --git a/libiberty/testsuite/d-demangle-expected 
b/libiberty/testsuite/d-demangle-expected
index e3f32e31d..778058b40 100644
--- a/libiberty/testsuite/d-demangle-expected
+++ b/libiberty/testsuite/d-demangle-expected
@@ -1406,3 +1406,87 @@ 
std.algorithm.iteration.FilterResult!(std.typecons.Tuple!(int, "a", int, "b", in
 --format=dlang
 
_D3std3uni__T6toCaseS_DQvQt12toLowerIndexFNaNbNiNewZtVii1043S_DQCjQCi10toLowerTabFNaNbNiNemZwSQDo5ascii7toLowerTAyaZQDzFNaNeQmZ14__foreachbody2MFNaNeKmKwZ14__foreachbody3MFNaNeKwZi
 std.uni.toCase!(std.uni.toLowerIndex(dchar), 1043, std.uni.toLowerTab(ulong), 
std.ascii.toLower, 
immutable(char)[]).toCase(immutable(char)[]).__foreachbody2(ref ulong, ref 
dchar).__foreachbody3(ref dchar)
+#
+--format=dlang
+_D3std8datetime9stopwatch9StopWatch6__ctorMFNbNcNiNfEQBz8typecons__T4FlagVAyaa9_6175746f5374617274ZQBfZSQDyQDxQDrQDk
+std.datetime.stopwatch.StopWatch.this(std.typecons.Flag!("autoStart").Flag)
+#
+--format=dlang
+_D4core4time8Duration__T8opBinaryVAyaa1_2bTSQBqQBoQBmZQBeMxFNaNbNiNfQzZQBc
+core.time.Duration.opBinary!("+", 
core.time.Duration).opBinary(core.time.Duration) const
+#
+--format=dlang
+_D4core4sync5mutex5Mutex__T12lock_nothrowTOCQBqQBoQBmQBjZQBeMOFNbNiNeZv
+core.sync.mutex.Mutex.lock_nothrow!(shared(core.sync.mutex.Mutex)).lock_nothrow()
 shared
+#
+--format=dlang
+_D4core8internal5array8capacity__T22_d_arraysetlengthTImplHTAPmTQdZ18_d_arraysetlengthTFNaNbNeMNkKQBmmZm
+core.internal.array.capacity._d_arraysetlengthTImpl!(ulong*[], 
ulong*)._d_arraysetlengthT(scope return ref ulong*[], ulong)
+#
+--format=dlang
+_D3std6random__T7uniformVAyaa2_5b29TiTiTSQBnQBm__T21MersenneTwisterEngineTkVmi32Vmi624Vmi397Vmi31Vki2567483615Vmi11Vki4294967295Vmi7Vki2636928640Vmi15Vki4022730752Vmi18Vki1812433253ZQFcZQGoFNaNfiiKQGbZi
+std.random.uniform!("[)", int, int, std.random.MersenneTwisterEngine!(uint, 
32uL, 624uL, 397uL, 31uL, 2567483615u, 11uL, 4294967295u, 7uL, 2636928640u, 
15uL, 4022730752u, 18uL, 1812433253u).MersenneTwisterEngine).uniform(int, int, 
ref std.random.MersenneTwisterEngine!(uint, 32uL, 624uL, 397uL, 31uL, 
2567483615u, 11uL, 4294967295u, 7uL, 2636928640u, 15uL, 4022730752u, 18uL, 
1812433253u).MersenneTwisterEngine)
+#
+--format=dlang
+_D3std5range__T9GeneratorS_D3rcu8gen_listFZ9__lambda1FNfZiZQBs8popFrontMFNfZv
+std.range.Generator!(rcu.gen_list().__lambda1()).Generator.popFront()
+#
+--format=dlang
+_D3std4conv__T4textTAyaTQeTQhZQqFNaNbNfQtQvQxZQBa
+std.conv.text!(immutable(char)[], immutable(char)[], 
immutable(char)[]).text(immutable(char)[], immutable(char)[], immutable(char)[])
+#
+--format=dlang
+_D3std6format15FormatException6__ctorMFNaNbNiNfAyaQdmC6object9ThrowableZCQCtQCsQCo
+std.format.FormatException.this(immutable(char)[], immutable(char)[], ulong, 
object.Throwable)
+#
+--format=dlang
+_D3std9algorithm8mutation__T11moveEmplaceTASQBq8datetime8timezone13PosixTimeZone14TempTransitionZQCrFNaNbNiKQCoKQCsZv
+std.algorithm.mutation.moveEmplace!(std.datetime.timezone.PosixTimeZone.TempTransition[]).moveEmplace(ref
 std.datetime.timezone.PosixTimeZone.TempTransition[], ref 
std.datetime.timezone.PosixTimeZone.TempTransition[])
+#
+--format=dlang
+_D3rcu3rndS3std6random__T21MersenneTwisterEngineTkVmi32Vmi624Vmi397Vmi31Vki2567483615Vmi11Vki4294967295Vmi7Vki2636928640Vmi15Vki4022730752Vmi18Vki1812433253ZQFc
+rcu.rnd
+#
+--format=dlang --ret-postfix
+_D3rcu3rndS3std6random__T21MersenneTwisterEngineTkVmi32Vmi624Vmi397Vmi31Vki2567483615Vmi11Vki4294967295Vmi7Vki2636928640Vmi15Vki4022730752Vmi18Vki1812433253ZQFc
+rcu.rnd std.random.MersenneTwisterEngine!(uint, 32uL, 624uL, 397uL, 31uL, 
2567483615u, 11uL, 4294967295u, 7uL, 2636928640u, 15uL, 4022730752u, 18uL, 
1812433253u).MersenneTwisterEngine
+#
+--format=dlang
+_D3rcu4secsFxS4core4time8DurationZd
+rcu.secs(const(core.time.Duration))
+#
+--format=dlang --ret-postfix
+_D3rcu4secsFxS4core4time8DurationZd
+rcu.secs(const(core.time.Duration)) double
+#
+--format=dlang
+_D3rcu6readerFiZv
+rcu.reader(int)
+#
+--format=dlang --ret-postfix
+_D3rcu6readerFiZv
+rcu.reader(int) void
+#
+--format=dlang
+_D3std5stdio__T8writeflnTaTiZQoFNfxAaiZv
+std.stdio.writefln!(char, int).writefln(const(char[]), int)
+#
+--format=dlang --ret-postfix
+_D3std5stdio__T8writeflnTaTiZQoFNfxAaiZv
+std.stdio.writefln!(char, int).writefln(const(char[]), int) void
+#
+--format=dlang
+_D3rcu__T3RCUTSQn1AZQl15reader_accessorMFNbZSQBr__TQBqTQBpZQBy12RCU_Accessor
+rcu.RCU!(rcu.A).RCU.reader_accessor()
+#
+--format=dlang --ret-postfix
+_D3rcu__T3RCUTSQn1AZQl15reader_accessorMFNbZSQBr__TQBqTQBpZQBy12RCU_Accessor
+rcu.RCU!(rcu.A).RCU.reader_accessor() rcu.RCU!(rcu.A).RCU.RCU_Accessor
+#
+--format=dlang
+_D3std5array__TQjTSQr5range__T4TakeTSQBjQt__T9GeneratorS_D3rcu8gen_listFZ9__lambda1FNfZiZQBsZQClZQDnFNfQDhZAi
+std.array.array!(std.range.Take!(std.range.Generator!(rcu.gen_list().__lambda1()).Generator).Take).array(std.range.Take!(std.range.Generator!(rcu.gen_list().__lambda1()).Generator).Take)
+#
+--format=dlang --ret-postfix
+_D3std5array__TQjTSQr5range__T4TakeTSQBjQt__T9GeneratorS_D3rcu8gen_listFZ9__lambda1FNfZiZQBsZQClZQDnFNfQDhZAi
+std.array.array!(std.range.Take!(std.range.Generator!(rcu.gen_list().__lambda1()
 
int).Generator).Take).array(std.range.Take!(std.range.Generator!(rcu.gen_list().__lambda1()
 int).Generator).Take) int[]
-- 
2.26.2

Reply via email to