aboutsummaryrefslogtreecommitdiff
path: root/absl/debugging/internal/demangle.cc
diff options
context:
space:
mode:
authorChris Mihelich <cmihelic@google.com>2024-06-07 19:20:24 -0700
committerCopybara-Service <copybara-worker@google.com>2024-06-07 19:21:12 -0700
commit2f61aed18c4affd3a75a2b2d2468d23f2f16192a (patch)
tree193c30224ce971b2bde3c8385d24c91811d38b53 /absl/debugging/internal/demangle.cc
parent696b32788ca887881547380530926314c521ea7d (diff)
downloadabseil-2f61aed18c4affd3a75a2b2d2468d23f2f16192a.tar.gz
abseil-2f61aed18c4affd3a75a2b2d2468d23f2f16192a.tar.bz2
abseil-2f61aed18c4affd3a75a2b2d2468d23f2f16192a.zip
Demangle sr St <simple-id> <simple-id>, a dubious encoding found in the wild.
PiperOrigin-RevId: 641418373 Change-Id: I2999228cccfd18a000725b938a692c0c9004867c
Diffstat (limited to 'absl/debugging/internal/demangle.cc')
-rw-r--r--absl/debugging/internal/demangle.cc13
1 files changed, 13 insertions, 0 deletions
diff --git a/absl/debugging/internal/demangle.cc b/absl/debugging/internal/demangle.cc
index d97dfad4..f9dff5d8 100644
--- a/absl/debugging/internal/demangle.cc
+++ b/absl/debugging/internal/demangle.cc
@@ -2034,6 +2034,13 @@ static bool ParseBaseUnresolvedName(State *state) {
// <base-unresolved-name>
// ::= [gs] sr <unresolved-qualifier-level>+ E
// <base-unresolved-name>
+// ::= sr St <simple-id> <simple-id> # nonstandard
+//
+// The last case is not part of the official grammar but has been observed in
+// real-world examples that the GNU demangler (but not the LLVM demangler) is
+// able to decode; see demangle_test.cc for one such symbol name. The shape
+// sr St <simple-id> <simple-id> was inferred by closed-box testing of the GNU
+// demangler.
static bool ParseUnresolvedName(State *state) {
ComplexityGuard guard(state);
if (guard.IsTooComplex()) return false;
@@ -2067,6 +2074,12 @@ static bool ParseUnresolvedName(State *state) {
}
state->parse_state = copy;
+ if (ParseTwoCharToken(state, "sr") && ParseTwoCharToken(state, "St") &&
+ ParseSimpleId(state) && ParseSimpleId(state)) {
+ return true;
+ }
+ state->parse_state = copy;
+
return false;
}