diff options
author | Tomasz Miąsko <tomasz.miasko@gmail.com> | 2021-06-07 23:35:50 +0200 |
---|---|---|
committer | Tomasz Miąsko <tomasz.miasko@gmail.com> | 2021-06-08 10:01:50 +0200 |
commit | f9a79356f223035ccf0b4d0666f8779061eddc61 (patch) | |
tree | f1c1bf2deb18c43c0aaaae2857161f1420b12b88 /llvm/lib/Demangle/RustDemangle.cpp | |
parent | 44d63c57c129f6c784460070c30cb736dbbdb927 (diff) | |
download | llvm-f9a79356f223035ccf0b4d0666f8779061eddc61.zip llvm-f9a79356f223035ccf0b4d0666f8779061eddc61.tar.gz llvm-f9a79356f223035ccf0b4d0666f8779061eddc61.tar.bz2 |
[Demangle][Rust] Parse const backreferences
Reviewed By: dblaikie
Differential Revision: https://reviews.llvm.org/D103848
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; } |