diff options
author | Chris Mihelich <cmihelic@google.com> | 2024-06-05 09:17:05 -0700 |
---|---|---|
committer | Copybara-Service <copybara-worker@google.com> | 2024-06-05 09:17:46 -0700 |
commit | 8322d3abcc155dcb8b18e4a702ecf1f1e19dafe0 (patch) | |
tree | 9607bd4629b0fd8fa83b0a03a7b6092fb03330c1 /absl/debugging | |
parent | cba68bb93b102416843d364348bc29ca665da1ce (diff) | |
download | abseil-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.cc | 9 | ||||
-rw-r--r-- | absl/debugging/internal/demangle_test.cc | 15 |
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]; |