[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