aboutsummaryrefslogtreecommitdiff
path: root/absl/debugging/internal/demangle_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'absl/debugging/internal/demangle_test.cc')
-rw-r--r--absl/debugging/internal/demangle_test.cc29
1 files changed, 29 insertions, 0 deletions
diff --git a/absl/debugging/internal/demangle_test.cc b/absl/debugging/internal/demangle_test.cc
index 1b305f74..68a759c1 100644
--- a/absl/debugging/internal/demangle_test.cc
+++ b/absl/debugging/internal/demangle_test.cc
@@ -1845,6 +1845,35 @@ TEST(Demangle, ThreadLocalWrappers) {
EXPECT_STREQ("thread-local initialization routine for ns::var", tmp);
}
+TEST(Demangle, DubiousSrStSymbols) {
+ char tmp[80];
+
+ // GNU demangling (not accepted by LLVM):
+ //
+ // S<std::u<char>::v> f<char>()
+ EXPECT_TRUE(Demangle("_Z1fIcE1SIXsrSt1uIT_E1vEEv", tmp, sizeof(tmp)));
+ EXPECT_STREQ("f<>()", tmp);
+
+ // A real case from the wild.
+ //
+ // GNU demangling (not accepted by LLVM) with line breaks and indentation
+ // added for readability:
+ //
+ // __gnu_cxx::__enable_if<std::__is_char<char>::__value, bool>::__type
+ // std::operator==<char>(
+ // std::__cxx11::basic_string<char, std::char_traits<char>,
+ // std::allocator<char> > const&,
+ // std::__cxx11::basic_string<char, std::char_traits<char>,
+ // std::allocator<char> > const&)
+ EXPECT_TRUE(Demangle(
+ "_ZSteqIcEN9__gnu_cxx11__enable_if"
+ "IXsrSt9__is_charIT_E7__valueEbE"
+ "6__typeE"
+ "RKNSt7__cxx1112basic_stringIS3_St11char_traitsIS3_ESaIS3_EEESE_",
+ tmp, sizeof(tmp)));
+ EXPECT_STREQ("std::operator==<>()", tmp);
+}
+
// Test one Rust symbol to exercise Demangle's delegation path. Rust demangling
// itself is more thoroughly tested in demangle_rust_test.cc.
TEST(Demangle, DelegatesToDemangleRustSymbolEncoding) {