From c8671e7542ebfd928ee3e239315c8784fdd88e1c Mon Sep 17 00:00:00 2001 From: Chris Mihelich Date: Thu, 30 May 2024 11:28:11 -0700 Subject: Demangle lambdas in class member functions' default arguments. PiperOrigin-RevId: 638723132 Change-Id: I26ef4dbcb1b965a9d8c2f6092ccb51cf3575ba22 --- absl/debugging/internal/demangle_test.cc | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'absl/debugging/internal/demangle_test.cc') diff --git a/absl/debugging/internal/demangle_test.cc b/absl/debugging/internal/demangle_test.cc index 7705b0fd..58832e99 100644 --- a/absl/debugging/internal/demangle_test.cc +++ b/absl/debugging/internal/demangle_test.cc @@ -353,6 +353,34 @@ TEST(Demangle, LambdaWithExplicitPackArgument) { EXPECT_STREQ(tmp, "f<>()::{lambda()#1}::operator()<>()"); } +TEST(Demangle, LambdaInClassMemberDefaultArgument) { + char tmp[100]; + + // Source: + // + // struct S { + // static auto f(void (*g)() = [] {}) { return g; } + // }; + // void (*p)() = S::f(); + // + // Full LLVM demangling of the lambda call operator: + // + // S::f(void (*)())::'lambda'()::operator()() const + // + // Full GNU binutils demangling: + // + // S::f(void (*)())::{default arg#1}::{lambda()#1}::operator()() const + ASSERT_TRUE(Demangle("_ZZN1S1fEPFvvEEd_NKUlvE_clEv", tmp, sizeof(tmp))); + EXPECT_STREQ(tmp, "S::f()::{default arg#1}::{lambda()#1}::operator()()"); + + // The same but in the second rightmost default argument. + ASSERT_TRUE(Demangle("_ZZN1S1fEPFvvEEd0_NKUlvE_clEv", tmp, sizeof(tmp))); + EXPECT_STREQ(tmp, "S::f()::{default arg#2}::{lambda()#1}::operator()()"); + + // Reject negative <(parameter) number> values. + ASSERT_FALSE(Demangle("_ZZN1S1fEPFvvEEdn1_NKUlvE_clEv", tmp, sizeof(tmp))); +} + TEST(Demangle, SubstpackNotationForTroublesomeTemplatePack) { char tmp[100]; -- cgit v1.2.3