diff options
Diffstat (limited to 'llvm/lib/Demangle/RustDemangle.cpp')
-rw-r--r-- | llvm/lib/Demangle/RustDemangle.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/llvm/lib/Demangle/RustDemangle.cpp b/llvm/lib/Demangle/RustDemangle.cpp index 4a8f35b..919a668 100644 --- a/llvm/lib/Demangle/RustDemangle.cpp +++ b/llvm/lib/Demangle/RustDemangle.cpp @@ -625,8 +625,15 @@ void Demangler::demangleOptionalBinder() { // | "p" // placeholder // | <backref> void Demangler::demangleConst() { + if (Error || RecursionLevel >= MaxRecursionLevel) { + Error = true; + return; + } + SwapAndRestore<size_t> SaveRecursionLevel(RecursionLevel, RecursionLevel + 1); + + char C = consume(); BasicType Type; - if (parseBasicType(consume(), Type)) { + if (parseBasicType(C, Type)) { switch (Type) { case BasicType::I8: case BasicType::I16: @@ -652,10 +659,11 @@ void Demangler::demangleConst() { print('_'); break; default: - // FIXME demangle backreferences. Error = true; break; } + } else if (C == 'B') { + demangleBackref([&] { demangleConst(); }); } else { Error = true; } |