diff --git a/llvm/include/llvm/Demangle/RustDemangle.h b/llvm/include/llvm/Demangle/RustDemangle.h --- a/llvm/include/llvm/Demangle/RustDemangle.h +++ b/llvm/include/llvm/Demangle/RustDemangle.h @@ -80,6 +80,7 @@ void demangleType(); void demangleConst(); void demangleConstInt(); + void demangleConstBool(); Identifier parseIdentifier(); uint64_t parseOptionalBase62Number(char Tag); 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 @@ -411,11 +411,14 @@ case BasicType::USize: demangleConstInt(); break; + case BasicType::Bool: + demangleConstBool(); + break; case BasicType::Placeholder: print('_'); break; default: - // FIXME demangle backreferences, bool constants, and char constants. + // FIXME demangle backreferences and char constants. Error = true; break; } @@ -439,6 +442,19 @@ } } +// = "0_" // false +// | "1_" // true +void Demangler::demangleConstBool() { + StringView HexDigits; + parseHexNumber(HexDigits); + if (HexDigits == "0") + print("false"); + else if (HexDigits == "1") + print("true"); + else + Error = true; +} + // = ["u"] ["_"] Identifier Demangler::parseIdentifier() { bool Punycode = consumeIf('u'); 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 @@ -191,6 +191,22 @@ CHECK: u64::<0> _RIC3u64Ky0_E +; Bool constants + +CHECK: bool:: + _RIC4boolKb0_E + +CHECK: bool:: + _RIC4boolKb1_E + +; Invalid bool constants + +CHECK: _RIC4boolKb2_E + _RIC4boolKb2_E + +CHECK: _RIC4boolKbn0_E + _RIC4boolKbn0_E + ; Invalid mangled characters CHECK: _RNvC2a.1c