aboutsummaryrefslogtreecommitdiff
path: root/absl/debugging
diff options
context:
space:
mode:
authorChris Mihelich <cmihelic@google.com>2024-06-05 09:17:05 -0700
committerCopybara-Service <copybara-worker@google.com>2024-06-05 09:17:46 -0700
commit8322d3abcc155dcb8b18e4a702ecf1f1e19dafe0 (patch)
tree9607bd4629b0fd8fa83b0a03a7b6092fb03330c1 /absl/debugging
parentcba68bb93b102416843d364348bc29ca665da1ce (diff)
downloadabseil-8322d3abcc155dcb8b18e4a702ecf1f1e19dafe0.tar.gz
abseil-8322d3abcc155dcb8b18e4a702ecf1f1e19dafe0.tar.bz2
abseil-8322d3abcc155dcb8b18e4a702ecf1f1e19dafe0.zip
Demangle C++17 structured bindings, DC...E.
PiperOrigin-RevId: 640547784 Change-Id: Ib230993a358f89258367a1c10271c47be3b724e5
Diffstat (limited to 'absl/debugging')
-rw-r--r--absl/debugging/internal/demangle.cc9
-rw-r--r--absl/debugging/internal/demangle_test.cc15
2 files changed, 24 insertions, 0 deletions
diff --git a/absl/debugging/internal/demangle.cc b/absl/debugging/internal/demangle.cc
index ab611f71..99cc324b 100644
--- a/absl/debugging/internal/demangle.cc
+++ b/absl/debugging/internal/demangle.cc
@@ -821,6 +821,7 @@ static bool ParsePrefix(State *state) {
// ::= <source-name> [<abi-tags>]
// ::= <local-source-name> [<abi-tags>]
// ::= <unnamed-type-name> [<abi-tags>]
+// ::= DC <source-name>+ E # C++17 structured binding
//
// <local-source-name> is a GCC extension; see below.
static bool ParseUnqualifiedName(State *state) {
@@ -831,6 +832,14 @@ static bool ParseUnqualifiedName(State *state) {
ParseUnnamedTypeName(state)) {
return ParseAbiTags(state);
}
+
+ // DC <source-name>+ E
+ ParseState copy = state->parse_state;
+ if (ParseTwoCharToken(state, "DC") && OneOrMore(ParseSourceName, state) &&
+ ParseOneCharToken(state, 'E')) {
+ return true;
+ }
+ state->parse_state = copy;
return false;
}
diff --git a/absl/debugging/internal/demangle_test.cc b/absl/debugging/internal/demangle_test.cc
index c70cf660..2f2a48a6 100644
--- a/absl/debugging/internal/demangle_test.cc
+++ b/absl/debugging/internal/demangle_test.cc
@@ -632,6 +632,21 @@ TEST(Demangle, GlobalInitializers) {
EXPECT_STREQ("reference temporary for v", tmp);
}
+TEST(Demangle, StructuredBindings) {
+ char tmp[80];
+
+ // Source:
+ //
+ // struct S { int a, b; };
+ // const auto& [x, y] = S{1, 2};
+
+ // [x, y]
+ EXPECT_TRUE(Demangle("_ZDC1x1yE", tmp, sizeof(tmp)));
+
+ // reference temporary for [x, y]
+ EXPECT_TRUE(Demangle("_ZGRDC1x1yE_", tmp, sizeof(tmp)));
+}
+
// Test the GNU abi_tag extension.
TEST(Demangle, AbiTags) {
char tmp[80];