aboutsummaryrefslogtreecommitdiff
path: root/absl/debugging/internal
diff options
context:
space:
mode:
authorChris Mihelich <cmihelic@google.com>2024-05-21 10:48:36 -0700
committerCopybara-Service <copybara-worker@google.com>2024-05-21 10:49:20 -0700
commitbfbfc3c7ececefcadf74c9a7db345ba30189348b (patch)
treee08873fdd612cf1e16c51387909183e0acc05123 /absl/debugging/internal
parentc025a934b199d069510bb68ee552ae58a4394916 (diff)
downloadabseil-bfbfc3c7ececefcadf74c9a7db345ba30189348b.tar.gz
abseil-bfbfc3c7ececefcadf74c9a7db345ba30189348b.tar.bz2
abseil-bfbfc3c7ececefcadf74c9a7db345ba30189348b.zip
Recognize generic arguments containing only types in Rust mangled names.
We follow the C++ demangler in not printing the arguments, just an empty <>. PiperOrigin-RevId: 635858791 Change-Id: I24903d4c5a1e2060e92ca950bf7a61647aee655f
Diffstat (limited to 'absl/debugging/internal')
-rw-r--r--absl/debugging/internal/demangle_rust.cc24
-rw-r--r--absl/debugging/internal/demangle_rust_test.cc39
2 files changed, 62 insertions, 1 deletions
diff --git a/absl/debugging/internal/demangle_rust.cc b/absl/debugging/internal/demangle_rust.cc
index 8fbde02a..fd205924 100644
--- a/absl/debugging/internal/demangle_rust.cc
+++ b/absl/debugging/internal/demangle_rust.cc
@@ -154,7 +154,7 @@ class RustSymbolParser {
case 'X': return false; // trait-impl not yet implemented
case 'Y': goto trait_definition;
case 'N': goto nested_path;
- case 'I': return false; // generic-args not yet implemented
+ case 'I': goto generic_args;
case 'B': goto path_backref;
default: return false;
}
@@ -290,6 +290,26 @@ class RustSymbolParser {
--silence_depth_;
continue;
+ // generic-args -> I path generic-arg* E (I already consumed)
+ //
+ // We follow the C++ demangler in omitting all the arguments from the
+ // output, printing only the list opening and closing tokens.
+ generic_args:
+ ABSL_DEMANGLER_RECURSE(path, kBeginGenericArgList);
+ if (!Emit("::<>")) return false;
+ ++silence_depth_;
+ while (!Eat('E')) {
+ ABSL_DEMANGLER_RECURSE(generic_arg, kContinueGenericArgList);
+ }
+ --silence_depth_;
+ continue;
+
+ // generic-arg -> lifetime | type | K const
+ generic_arg:
+ if (Eat('L')) return false; // lifetime not yet implemented
+ if (Eat('K')) return false; // const not yet implemented
+ goto type;
+
// backref -> B base-62-number (B already consumed)
//
// The BeginBackref call parses and range-checks the base-62-number. We
@@ -335,6 +355,8 @@ class RustSymbolParser {
kAfterSecondTupleElement,
kAfterThirdTupleElement,
kAfterSubsequentTupleElement,
+ kBeginGenericArgList,
+ kContinueGenericArgList,
kPathBackrefEnding,
kTypeBackrefEnding,
};
diff --git a/absl/debugging/internal/demangle_rust_test.cc b/absl/debugging/internal/demangle_rust_test.cc
index c931304d..1525b522 100644
--- a/absl/debugging/internal/demangle_rust_test.cc
+++ b/absl/debugging/internal/demangle_rust_test.cc
@@ -360,6 +360,45 @@ TEST(DemangleRust, ReturnFromBackrefToInputPosition256) {
" as c::t>::f");
}
+TEST(DemangleRust, EmptyGenericArgs) {
+ EXPECT_DEMANGLING("_RINvC1c1fE", "c::f::<>");
+}
+
+TEST(DemangleRust, OneSimpleTypeInGenericArgs) {
+ EXPECT_DEMANGLING("_RINvC1c1flE", // c::f::<i32>
+ "c::f::<>");
+}
+
+TEST(DemangleRust, OneTupleInGenericArgs) {
+ EXPECT_DEMANGLING("_RINvC1c1fTlmEE", // c::f::<(i32, u32)>
+ "c::f::<>");
+}
+
+TEST(DemangleRust, OnePathInGenericArgs) {
+ EXPECT_DEMANGLING("_RINvC1c1fNtC1d1sE", // c::f::<d::s>
+ "c::f::<>");
+}
+
+TEST(DemangleRust, LongerGenericArgs) {
+ EXPECT_DEMANGLING("_RINvC1c1flmRNtC1d1sE", // c::f::<i32, u32, &d::s>
+ "c::f::<>");
+}
+
+TEST(DemangleRust, BackrefInGenericArgs) {
+ EXPECT_DEMANGLING("_RINvC1c1fRlB7_NtB2_1sE", // c::f::<&i32, &i32, c::s>
+ "c::f::<>");
+}
+
+TEST(DemangleRust, NestedGenericArgs) {
+ EXPECT_DEMANGLING("_RINvC1c1fINtB2_1slEmE", // c::f::<c::s::<i32>, u32>
+ "c::f::<>");
+}
+
+TEST(DemangleRust, MonomorphicEntityNestedInsideGeneric) {
+ EXPECT_DEMANGLING("_RNvINvC1c1fppE1g", // c::f::<_, _>::g
+ "c::f::<>::g");
+}
+
} // namespace
} // namespace debugging_internal
ABSL_NAMESPACE_END