diff --git a/tracetools/include/tracetools/utils.hpp b/tracetools/include/tracetools/utils.hpp index 2e882bc..3149992 100644 --- a/tracetools/include/tracetools/utils.hpp +++ b/tracetools/include/tracetools/utils.hpp @@ -38,4 +38,11 @@ const char * get_symbol(std::function f) return _demangle_symbol(f.target_type().name()); } +// Fallback meant for lambdas with captures +template +const char * get_symbol(L && l) +{ + return _demangle_symbol(typeid(l).name()); +} + #endif // TRACETOOLS__UTILS_HPP_ diff --git a/tracetools/test/test_utils.cpp b/tracetools/test/test_utils.cpp index ab94037..0bba91a 100644 --- a/tracetools/test/test_utils.cpp +++ b/tracetools/test/test_utils.cpp @@ -57,6 +57,25 @@ TEST(TestUtils, valid_symbol_lambda) { "invalid symbol"; } +/* + Testing symbol resolution lambdas with capture. + */ +TEST(TestUtils, valid_symbol_lambda_capture) { + int num = 1; + + auto l = [ = ]() {return num + 1;}; + EXPECT_STREQ( + get_symbol(l), + "TestUtils_valid_symbol_lambda_capture_Test::TestBody()::{lambda()#1}") << + "invalid symbol"; + + auto m = [&](int other_num) {return num + other_num;}; + EXPECT_STREQ( + get_symbol(m), + "TestUtils_valid_symbol_lambda_capture_Test::TestBody()::{lambda(int)#2}") << + "invalid symbol"; +} + /* Testing symbol resolution for std::function object created from std::bind. */