[Demangle][Rust] Parse dyn-bounds

Reviewed By: dblaikie

Differential Revision: https://reviews.llvm.org/D103151
This commit is contained in:
Tomasz Miąsko 2021-06-07 18:12:13 +02:00
parent fb5b590b5e
commit 89615a5e92
3 changed files with 38 additions and 0 deletions

View File

@ -89,6 +89,7 @@ private:
void demangleGenericArg();
void demangleType();
void demangleFnSig();
void demangleDynBounds();
void demangleOptionalBinder();
void demangleConst();
void demangleConstInt();

View File

@ -480,6 +480,17 @@ void Demangler::demangleType() {
case 'F':
demangleFnSig();
break;
case 'D':
demangleDynBounds();
if (consumeIf('L')) {
if (auto Lifetime = parseBase62Number()) {
print(" + ");
printLifetime(Lifetime);
}
} else {
Error = true;
}
break;
default:
Position = Start;
demanglePath(rust_demangle::InType::Yes);
@ -529,6 +540,16 @@ void Demangler::demangleFnSig() {
}
}
// <dyn-bounds> = [<binder>] {<dyn-trait>} "E"
void Demangler::demangleDynBounds() {
SwapAndRestore<size_t> SaveBoundLifetimes(BoundLifetimes, BoundLifetimes);
print("dyn ");
demangleOptionalBinder();
// FIXME demangle {dyn-trait}
if (!consumeIf('E'))
Error = true;
}
// Demangles optional binder and updates the number of bound lifetimes.
//
// <binder> = "G" <base-62-number>

View File

@ -232,6 +232,22 @@ CHECK: function::<extern "cdecl" fn()>
CHECK: function::<unsafe extern "C-cmse-nonsecure-call" fn()>
_RIC8functionFUK21C_cmse_nonsecure_callEuE
; Trait objects
CHECK: trait::<dyn >
_RIC5traitDEL_E
CHECK: trait::<dyn for<'a> >
_RIC5traitDG_EL_E
CHECK: trait::<for<'a> fn(dyn for<'b> + 'a)>
_RIC5traitFG_DG_EL0_EuE
; Invalid trait object, missing lifetime.
CHECK: _RIC5traitDEE
_RIC5traitDEE
; Binders
CHECK: binders::<for<'a> fn(&'a _)>