diff options
author | Tomasz Miąsko <tomasz.miasko@gmail.com> | 2021-06-07 23:35:25 +0200 |
---|---|---|
committer | Tomasz Miąsko <tomasz.miasko@gmail.com> | 2021-06-08 10:01:49 +0200 |
commit | 44d63c57c129f6c784460070c30cb736dbbdb927 (patch) | |
tree | 78d4ebaf914e2e5b2177d34b3f017422daaf3b0b /llvm/lib/Demangle/RustDemangle.cpp | |
parent | 82b7e822d00596ec8a02490f1d662ed0fa872b54 (diff) | |
download | llvm-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.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); |