diff --git a/llvm/lib/Demangle/RustDemangle.cpp b/llvm/lib/Demangle/RustDemangle.cpp --- a/llvm/lib/Demangle/RustDemangle.cpp +++ b/llvm/lib/Demangle/RustDemangle.cpp @@ -625,8 +625,15 @@ // | "p" // placeholder // | void Demangler::demangleConst() { + if (Error || RecursionLevel >= MaxRecursionLevel) { + Error = true; + return; + } + SwapAndRestore 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 @@ print('_'); break; default: - // FIXME demangle backreferences. Error = true; break; } + } else if (C == 'B') { + demangleBackref([&] { demangleConst(); }); } else { Error = true; } diff --git a/llvm/test/Demangle/rust.test b/llvm/test/Demangle/rust.test --- a/llvm/test/Demangle/rust.test +++ b/llvm/test/Demangle/rust.test @@ -428,6 +428,9 @@ CHECK: backref::<(), ()> _RIC7backrefuB9_E +CHECK: backref::<7, 7> + _RIC7backrefKi7_KBa_E + ; Invalid backreferences CHECK: _RB_ @@ -442,6 +445,9 @@ CHECK: _RIC7backrefSB9_E _RIC7backrefSB9_E +CHECK: _RIC7backrefKBa_E + _RIC7backrefKBa_E + ; Invalid mangled characters CHECK: _RNvC2a.1c