aboutsummaryrefslogtreecommitdiff
path: root/absl/debugging
diff options
context:
space:
mode:
authorChris Mihelich <cmihelic@google.com>2024-05-23 12:15:04 -0700
committerCopybara-Service <copybara-worker@google.com>2024-05-23 12:15:59 -0700
commitcfac0a350617776cf461ba8b9f743378eb4ae355 (patch)
tree506238de411f8abdfba1ffcb52f6dab41969599c /absl/debugging
parenta3c25aec21595adf6b1e16f2209fafd39c8e7942 (diff)
downloadabseil-cfac0a350617776cf461ba8b9f743378eb4ae355.tar.gz
abseil-cfac0a350617776cf461ba8b9f743378eb4ae355.tar.bz2
abseil-cfac0a350617776cf461ba8b9f743378eb4ae355.zip
Demangle the C++ spaceship operator (ss, operator<=>).
PiperOrigin-RevId: 636634618 Change-Id: I812115d2a33dc71446a14deadc6af019eef6dfd7
Diffstat (limited to 'absl/debugging')
-rw-r--r--absl/debugging/internal/demangle.cc1
-rw-r--r--absl/debugging/internal/demangle_test.cc22
2 files changed, 23 insertions, 0 deletions
diff --git a/absl/debugging/internal/demangle.cc b/absl/debugging/internal/demangle.cc
index 1b9ca57b..ff89f8d8 100644
--- a/absl/debugging/internal/demangle.cc
+++ b/absl/debugging/internal/demangle.cc
@@ -81,6 +81,7 @@ static const AbbrevPair kOperatorList[] = {
{"rs", ">>", 2},
{"lS", "<<=", 2},
{"rS", ">>=", 2},
+ {"ss", "<=>", 2},
{"eq", "==", 2},
{"ne", "!=", 2},
{"lt", "<", 2},
diff --git a/absl/debugging/internal/demangle_test.cc b/absl/debugging/internal/demangle_test.cc
index 0044d420..45fba703 100644
--- a/absl/debugging/internal/demangle_test.cc
+++ b/absl/debugging/internal/demangle_test.cc
@@ -349,6 +349,28 @@ TEST(Demangle, SizeofPacks) {
EXPECT_STREQ("g<>()", tmp);
}
+TEST(Demangle, Spaceship) {
+ char tmp[80];
+
+ // #include <compare>
+ //
+ // struct S { auto operator<=>(const S&) const = default; };
+ // auto (S::*f) = &S::operator<=>; // make sure S::operator<=> is emitted
+ //
+ // template <class T> auto g(T x, T y) -> decltype(x <=> y) {
+ // return x <=> y;
+ // }
+ // template auto g<S>(S x, S y) -> decltype(x <=> y);
+
+ // S::operator<=>(S const&) const
+ EXPECT_TRUE(Demangle("_ZNK1SssERKS_", tmp, sizeof(tmp)));
+ EXPECT_STREQ("S::operator<=>()", tmp);
+
+ // decltype(fp <=> fp0) g<S>(S, S)
+ EXPECT_TRUE(Demangle("_Z1gI1SEDTssfp_fp0_ET_S2_", tmp, sizeof(tmp)));
+ EXPECT_STREQ("g<>()", 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) {