aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Mihelich <cmihelic@google.com>2024-05-23 14:45:31 -0700
committerCopybara-Service <copybara-worker@google.com>2024-05-23 14:46:26 -0700
commitb3cd02500c67749ee7441987cb7d37c89aead79b (patch)
tree3e815489d9dbedac4a55ecd9f7f39b150cf934e4
parenta7d70c872aaf5bfa8efcdb2814e914a7eabbe7d5 (diff)
downloadabseil-b3cd02500c67749ee7441987cb7d37c89aead79b.tar.gz
abseil-b3cd02500c67749ee7441987cb7d37c89aead79b.tar.bz2
abseil-b3cd02500c67749ee7441987cb7d37c89aead79b.zip
Stop eating an extra E in ParseTemplateArg for some L<type><value>E literals.
PiperOrigin-RevId: 636682763 Change-Id: I9e5fd6827cb780c288ff5af54643ee4fbbaca6d5
-rw-r--r--absl/debugging/internal/demangle.cc8
-rw-r--r--absl/debugging/internal/demangle_test.cc8
2 files changed, 12 insertions, 4 deletions
diff --git a/absl/debugging/internal/demangle.cc b/absl/debugging/internal/demangle.cc
index e9c8d176..6d24f8ed 100644
--- a/absl/debugging/internal/demangle.cc
+++ b/absl/debugging/internal/demangle.cc
@@ -585,7 +585,7 @@ static bool ParseFunctionParam(State* state);
static bool ParseBracedExpression(State *state);
static bool ParseExpression(State *state);
static bool ParseExprPrimary(State *state);
-static bool ParseExprCastValue(State *state);
+static bool ParseExprCastValueAndTrailingE(State *state);
static bool ParseQRequiresClauseExpr(State *state);
static bool ParseLocalName(State *state);
static bool ParseLocalNameSuffix(State *state);
@@ -1633,7 +1633,7 @@ static bool ParseTemplateArg(State *state) {
// ::= L <source-name> [<template-args>] [<expr-cast-value> E]
if (ParseLocalSourceName(state) && Optional(ParseTemplateArgs(state))) {
copy = state->parse_state;
- if (ParseExprCastValue(state) && ParseOneCharToken(state, 'E')) {
+ if (ParseExprCastValueAndTrailingE(state)) {
return true;
}
state->parse_state = copy;
@@ -2005,7 +2005,7 @@ static bool ParseExprPrimary(State *state) {
// The merged cast production.
if (ParseOneCharToken(state, 'L') && ParseType(state) &&
- ParseExprCastValue(state)) {
+ ParseExprCastValueAndTrailingE(state)) {
return true;
}
state->parse_state = copy;
@@ -2020,7 +2020,7 @@ static bool ParseExprPrimary(State *state) {
}
// <number> or <float>, followed by 'E', as described above ParseExprPrimary.
-static bool ParseExprCastValue(State *state) {
+static bool ParseExprCastValueAndTrailingE(State *state) {
ComplexityGuard guard(state);
if (guard.IsTooComplex()) return false;
// We have to be able to backtrack after accepting a number because we could
diff --git a/absl/debugging/internal/demangle_test.cc b/absl/debugging/internal/demangle_test.cc
index b16c83f8..269a35aa 100644
--- a/absl/debugging/internal/demangle_test.cc
+++ b/absl/debugging/internal/demangle_test.cc
@@ -276,6 +276,14 @@ TEST(Demangle, Clones) {
EXPECT_FALSE(Demangle("_ZL3Foov.isra.2.constprop.", tmp, sizeof(tmp)));
}
+TEST(Demangle, LiteralOfGlobalNamespaceEnumType) {
+ char tmp[80];
+
+ // void f<(E)42>()
+ EXPECT_TRUE(Demangle("_Z1fIL1E42EEvv", tmp, sizeof(tmp)));
+ EXPECT_STREQ("f<>()", tmp);
+}
+
// Test the GNU abi_tag extension.
TEST(Demangle, AbiTags) {
char tmp[80];