diff options
-rw-r--r-- | absl/debugging/internal/demangle_rust.cc | 24 | ||||
-rw-r--r-- | absl/debugging/internal/demangle_rust_test.cc | 39 |
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 |