aboutsummaryrefslogtreecommitdiff
path: root/absl/debugging/internal/demangle.cc
diff options
context:
space:
mode:
authorChris Mihelich <cmihelic@google.com>2024-05-28 14:10:13 -0700
committerCopybara-Service <copybara-worker@google.com>2024-05-28 14:11:10 -0700
commit3ef92c6f375e71316c313a3f1a204c494cd3f762 (patch)
tree076ecdbd16bdad0e3a87947318763d97083e86d9 /absl/debugging/internal/demangle.cc
parent6ec17dc63626431c6d2b0403ad4c4b9ba1ceb7d3 (diff)
downloadabseil-3ef92c6f375e71316c313a3f1a204c494cd3f762.tar.gz
abseil-3ef92c6f375e71316c313a3f1a204c494cd3f762.tar.bz2
abseil-3ef92c6f375e71316c313a3f1a204c494cd3f762.zip
Demangle lambdas with explicit template arguments (UlTy and similar forms).
PiperOrigin-RevId: 638019038 Change-Id: I96a87e4736677df9d44520e4510e089a27372765
Diffstat (limited to 'absl/debugging/internal/demangle.cc')
-rw-r--r--absl/debugging/internal/demangle.cc7
1 files changed, 6 insertions, 1 deletions
diff --git a/absl/debugging/internal/demangle.cc b/absl/debugging/internal/demangle.cc
index 91bea72d..1290ff65 100644
--- a/absl/debugging/internal/demangle.cc
+++ b/absl/debugging/internal/demangle.cc
@@ -861,7 +861,11 @@ static bool ParseLocalSourceName(State *state) {
// <unnamed-type-name> ::= Ut [<(nonnegative) number>] _
// ::= <closure-type-name>
// <closure-type-name> ::= Ul <lambda-sig> E [<(nonnegative) number>] _
-// <lambda-sig> ::= <(parameter) type>+
+// <lambda-sig> ::= <template-param-decl>* <(parameter) type>+
+//
+// For <template-param-decl>* in <lambda-sig> see:
+//
+// https://github.com/itanium-cxx-abi/cxx-abi/issues/31
static bool ParseUnnamedTypeName(State *state) {
ComplexityGuard guard(state);
if (guard.IsTooComplex()) return false;
@@ -884,6 +888,7 @@ static bool ParseUnnamedTypeName(State *state) {
// Closure type.
which = -1;
if (ParseTwoCharToken(state, "Ul") && DisableAppend(state) &&
+ ZeroOrMore(ParseTemplateParamDecl, state) &&
OneOrMore(ParseType, state) && RestoreAppend(state, copy.append) &&
ParseOneCharToken(state, 'E') && Optional(ParseNumber(state, &which)) &&
which <= std::numeric_limits<int>::max() - 2 && // Don't overflow.