diff options
Diffstat (limited to 'llvm/lib/Demangle/RustDemangle.cpp')
-rw-r--r-- | llvm/lib/Demangle/RustDemangle.cpp | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/llvm/lib/Demangle/RustDemangle.cpp b/llvm/lib/Demangle/RustDemangle.cpp index 3ce73f5..4a8f35b 100644 --- a/llvm/lib/Demangle/RustDemangle.cpp +++ b/llvm/lib/Demangle/RustDemangle.cpp @@ -438,8 +438,13 @@ void Demangler::printBasicType(BasicType Type) { // | "D" <dyn-bounds> <lifetime> // dyn Trait<Assoc = X> + Send + 'a // | <backref> // backref void Demangler::demangleType() { - size_t Start = Position; + if (Error || RecursionLevel >= MaxRecursionLevel) { + Error = true; + return; + } + SwapAndRestore<size_t> SaveRecursionLevel(RecursionLevel, RecursionLevel + 1); + size_t Start = Position; char C = consume(); BasicType Type; if (parseBasicType(C, Type)) @@ -506,6 +511,9 @@ void Demangler::demangleType() { Error = true; } break; + case 'B': + demangleBackref([&] { demangleType(); }); + break; default: Position = Start; demanglePath(rust_demangle::InType::Yes); |