From 1499afa09ba27ee0e6569668b74fea40e0458930 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Tomasz=20Mi=C4=85sko?= Date: Mon, 7 Jun 2021 18:13:19 +0200 Subject: [PATCH] [Demangle][Rust] Parse dyn-trait Reviewed By: dblaikie Differential Revision: https://reviews.llvm.org/D103361 --- llvm/include/llvm/Demangle/RustDemangle.h | 1 + llvm/lib/Demangle/RustDemangle.cpp | 15 ++++++++++++--- llvm/test/Demangle/rust.test | 9 +++++++++ 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/llvm/include/llvm/Demangle/RustDemangle.h b/llvm/include/llvm/Demangle/RustDemangle.h index 8158787..1302203 100644 --- a/llvm/include/llvm/Demangle/RustDemangle.h +++ b/llvm/include/llvm/Demangle/RustDemangle.h @@ -90,6 +90,7 @@ private: void demangleType(); void demangleFnSig(); void demangleDynBounds(); + void demangleDynTrait(); void demangleOptionalBinder(); void demangleConst(); void demangleConstInt(); diff --git a/llvm/lib/Demangle/RustDemangle.cpp b/llvm/lib/Demangle/RustDemangle.cpp index 04bc175..cbb52fa 100644 --- a/llvm/lib/Demangle/RustDemangle.cpp +++ b/llvm/lib/Demangle/RustDemangle.cpp @@ -545,9 +545,18 @@ void Demangler::demangleDynBounds() { SwapAndRestore SaveBoundLifetimes(BoundLifetimes, BoundLifetimes); print("dyn "); demangleOptionalBinder(); - // FIXME demangle {dyn-trait} - if (!consumeIf('E')) - Error = true; + for (size_t I = 0; !Error && !consumeIf('E'); ++I) { + if (I > 0) + print(" + "); + demangleDynTrait(); + } +} + +// = {} +// = "p" +void Demangler::demangleDynTrait() { + demanglePath(InType::Yes); + // FIXME demangle {} } // 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 caded76..59b41f6 100644 --- a/llvm/test/Demangle/rust.test +++ b/llvm/test/Demangle/rust.test @@ -243,6 +243,15 @@ CHECK: trait:: > CHECK: trait:: fn(dyn for<'b> + 'a)> _RIC5traitFG_DG_EL0_EuE +CHECK: trait:: + _RIC5traitDC7DisplayEL_E + +CHECK: trait:: + _RIC5traitDC7DisplayC4SendC4SyncEL_E + +CHECK: trait:: Display> + _RIC5traitDG_C7DisplayEL_E + ; Invalid trait object, missing lifetime. CHECK: _RIC5traitDEE -- 2.7.4