aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Demangle/RustDemangle.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Demangle/RustDemangle.cpp')
-rw-r--r--llvm/lib/Demangle/RustDemangle.cpp12
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;
}