aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Demangle/RustDemangle.cpp
diff options
context:
space:
mode:
authorTomasz Miąsko <tomasz.miasko@gmail.com>2021-06-07 23:35:25 +0200
committerTomasz Miąsko <tomasz.miasko@gmail.com>2021-06-08 10:01:49 +0200
commit44d63c57c129f6c784460070c30cb736dbbdb927 (patch)
tree78d4ebaf914e2e5b2177d34b3f017422daaf3b0b /llvm/lib/Demangle/RustDemangle.cpp
parent82b7e822d00596ec8a02490f1d662ed0fa872b54 (diff)
downloadllvm-44d63c57c129f6c784460070c30cb736dbbdb927.zip
llvm-44d63c57c129f6c784460070c30cb736dbbdb927.tar.gz
llvm-44d63c57c129f6c784460070c30cb736dbbdb927.tar.bz2
[Demangle][Rust] Parse type backreferences
Reviewed By: dblaikie Differential Revision: https://reviews.llvm.org/D103847
Diffstat (limited to 'llvm/lib/Demangle/RustDemangle.cpp')
-rw-r--r--llvm/lib/Demangle/RustDemangle.cpp10
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);