[llvm] 619a65e - [Demangle][Rust] Parse dyn-trait-assoc-binding

Tomasz Miąsko via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 7 09:25:29 PDT 2021


Author: Tomasz Miąsko
Date: 2021-06-07T18:18:31+02:00
New Revision: 619a65e5e4ed0df7b753eac9d7d41be976fd909b

URL: https://github.com/llvm/llvm-project/commit/619a65e5e4ed0df7b753eac9d7d41be976fd909b
DIFF: https://github.com/llvm/llvm-project/commit/619a65e5e4ed0df7b753eac9d7d41be976fd909b.diff

LOG: [Demangle][Rust] Parse dyn-trait-assoc-binding

Reviewed By: dblaikie

Differential Revision: https://reviews.llvm.org/D103364

Added: 
    

Modified: 
    llvm/include/llvm/Demangle/RustDemangle.h
    llvm/lib/Demangle/RustDemangle.cpp
    llvm/test/Demangle/rust.test

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/Demangle/RustDemangle.h b/llvm/include/llvm/Demangle/RustDemangle.h
index 1302203f6f88..c2372cd8acb1 100644
--- a/llvm/include/llvm/Demangle/RustDemangle.h
+++ b/llvm/include/llvm/Demangle/RustDemangle.h
@@ -57,6 +57,11 @@ enum class InType {
   Yes,
 };
 
+enum class LeaveOpen {
+  No,
+  Yes,
+};
+
 class Demangler {
   // Maximum recursion level. Used to avoid stack overflow.
   size_t MaxRecursionLevel;
@@ -84,7 +89,7 @@ class Demangler {
   bool demangle(StringView MangledName);
 
 private:
-  void demanglePath(InType InType);
+  bool demanglePath(InType InType, LeaveOpen LeaveOpen = LeaveOpen::No);
   void demangleImplPath(InType InType);
   void demangleGenericArg();
   void demangleType();

diff  --git a/llvm/lib/Demangle/RustDemangle.cpp b/llvm/lib/Demangle/RustDemangle.cpp
index cbb52fa43b18..9513a00628d1 100644
--- a/llvm/lib/Demangle/RustDemangle.cpp
+++ b/llvm/lib/Demangle/RustDemangle.cpp
@@ -121,7 +121,10 @@ bool Demangler::demangle(StringView Mangled) {
   return !Error;
 }
 
-// Demangles a path. InType indicates whether a path is inside a type.
+// Demangles a path. InType indicates whether a path is inside a type. When
+// LeaveOpen is true, a closing `>` after generic arguments is omitted from the
+// output. Return value indicates whether generics arguments have been left
+// open.
 //
 // <path> = "C" <identifier>               // crate root
 //        | "M" <impl-path> <type>         // <T> (inherent impl)
@@ -135,10 +138,10 @@ bool Demangler::demangle(StringView Mangled) {
 //      | "S"      // shim
 //      | <A-Z>    // other special namespaces
 //      | <a-z>    // internal namespaces
-void Demangler::demanglePath(InType InType) {
+bool Demangler::demanglePath(InType InType, LeaveOpen LeaveOpen) {
   if (Error || RecursionLevel >= MaxRecursionLevel) {
     Error = true;
-    return;
+    return false;
   }
   SwapAndRestore<size_t> SaveRecursionLevel(RecursionLevel, RecursionLevel + 1);
 
@@ -220,7 +223,10 @@ void Demangler::demanglePath(InType InType) {
         print(", ");
       demangleGenericArg();
     }
-    print(">");
+    if (LeaveOpen == rust_demangle::LeaveOpen::Yes)
+      return true;
+    else
+      print(">");
     break;
   }
   default:
@@ -228,6 +234,8 @@ void Demangler::demanglePath(InType InType) {
     Error = true;
     break;
   }
+
+  return false;
 }
 
 // <impl-path> = [<disambiguator>] <path>
@@ -555,8 +563,20 @@ void Demangler::demangleDynBounds() {
 // <dyn-trait> = <path> {<dyn-trait-assoc-binding>}
 // <dyn-trait-assoc-binding> = "p" <undisambiguated-identifier> <type>
 void Demangler::demangleDynTrait() {
-  demanglePath(InType::Yes);
-  // FIXME demangle {<dyn-trait-assoc-binding>}
+  bool IsOpen = demanglePath(InType::Yes, LeaveOpen::Yes);
+  while (!Error && consumeIf('p')) {
+    if (!IsOpen) {
+      IsOpen = true;
+      print('<');
+    } else {
+      print(", ");
+    }
+    print(parseIdentifier().Name);
+    print(" = ");
+    demangleType();
+  }
+  if (IsOpen)
+    print(">");
 }
 
 // Demangles optional binder and updates the number of bound lifetimes.

diff  --git a/llvm/test/Demangle/rust.test b/llvm/test/Demangle/rust.test
index 59b41f68d511..04af35b76d6e 100644
--- a/llvm/test/Demangle/rust.test
+++ b/llvm/test/Demangle/rust.test
@@ -252,6 +252,15 @@ CHECK: trait::<dyn Display + Send + Sync>
 CHECK: trait::<dyn for<'a> Display>
        _RIC5traitDG_C7DisplayEL_E
 
+CHECK: trait::<dyn IntoIterator<_, Item = _>>
+       _RIC5traitDIC12IntoIteratorpEp4ItempEL_E
+
+CHECK: trait::<dyn IntoIterator<Item = _>>
+       _RIC5traitDC12IntoIteratorp4ItempEL_E
+
+CHECK: trait::<dyn IntoIterator<Item = _, IntoIter = _>>
+       _RIC5traitDC12IntoIteratorp4Itempp8IntoIterpEL_E
+
 ; Invalid trait object, missing lifetime.
 
 CHECK: _RIC5traitDEE


        


More information about the llvm-commits mailing list