Commit bfbfc3c7 by Chris Mihelich Committed by Copybara-Service

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
parent c025a934
...@@ -154,7 +154,7 @@ class RustSymbolParser { ...@@ -154,7 +154,7 @@ class RustSymbolParser {
case 'X': return false; // trait-impl not yet implemented case 'X': return false; // trait-impl not yet implemented
case 'Y': goto trait_definition; case 'Y': goto trait_definition;
case 'N': goto nested_path; case 'N': goto nested_path;
case 'I': return false; // generic-args not yet implemented case 'I': goto generic_args;
case 'B': goto path_backref; case 'B': goto path_backref;
default: return false; default: return false;
} }
...@@ -290,6 +290,26 @@ class RustSymbolParser { ...@@ -290,6 +290,26 @@ class RustSymbolParser {
--silence_depth_; --silence_depth_;
continue; 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) // backref -> B base-62-number (B already consumed)
// //
// The BeginBackref call parses and range-checks the base-62-number. We // The BeginBackref call parses and range-checks the base-62-number. We
...@@ -335,6 +355,8 @@ class RustSymbolParser { ...@@ -335,6 +355,8 @@ class RustSymbolParser {
kAfterSecondTupleElement, kAfterSecondTupleElement,
kAfterThirdTupleElement, kAfterThirdTupleElement,
kAfterSubsequentTupleElement, kAfterSubsequentTupleElement,
kBeginGenericArgList,
kContinueGenericArgList,
kPathBackrefEnding, kPathBackrefEnding,
kTypeBackrefEnding, kTypeBackrefEnding,
}; };
......
...@@ -360,6 +360,45 @@ TEST(DemangleRust, ReturnFromBackrefToInputPosition256) { ...@@ -360,6 +360,45 @@ TEST(DemangleRust, ReturnFromBackrefToInputPosition256) {
" as c::t>::f"); " 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
} // namespace debugging_internal } // namespace debugging_internal
ABSL_NAMESPACE_END ABSL_NAMESPACE_END
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment