From 6e33d881e2c86d542250ad1a5fe5e43a98a2317e Mon Sep 17 00:00:00 2001 From: Vladislav Shchapov Date: Wed, 28 Sep 2022 00:07:32 +0500 Subject: [PATCH] Normalization of stdlib inline namespace names Signed-off-by: Vladislav Shchapov --- include/fmt/std.h | 32 ++++++++++++++++++++++++++++---- test/std-test.cc | 19 ++++++++++++++++++- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/include/fmt/std.h b/include/fmt/std.h index 02ca6721..7f484274 100644 --- a/include/fmt/std.h +++ b/include/fmt/std.h @@ -214,10 +214,34 @@ struct formatter< std::size_t size = 0; std::unique_ptr demangled_name_ptr( abi::__cxa_demangle(ti.name(), nullptr, &size, &status), &std::free); - out = detail::write_bytes( - out, - string_view(demangled_name_ptr ? demangled_name_ptr.get() : ti.name()), - spec); + string_view demangled_name_view( + demangled_name_ptr ? demangled_name_ptr.get() : ti.name()); + + // Normalization of stdlib inline namespace names. + if (demangled_name_view.starts_with("std::")) { + // Separation of user's and system exception classes. + demangled_name_view.remove_prefix(5); + out = detail::write_bytes(out, string_view("std::"), spec); + + // libc++ inline namespaces. + // std::__1::* -> std::* + // std::__1::__fs::* -> std::* + if (demangled_name_view.starts_with("__1::")) { + demangled_name_view.remove_prefix(5); + if (demangled_name_view.starts_with("__fs::")) + demangled_name_view.remove_prefix(6); + } + // libstdc++ inline namespaces. + // std::__cxx11::* -> std::* + // std::filesystem::__cxx11::* -> std::filesystem::* + else if (demangled_name_view.starts_with("__cxx11::")) { + demangled_name_view.remove_prefix(9); + } else if (demangled_name_view.starts_with("filesystem::__cxx11::")) { + demangled_name_view.remove_prefix(21); + out = detail::write_bytes(out, string_view("filesystem::"), spec); + } + } + out = detail::write_bytes(out, demangled_name_view, spec); #elif FMT_MSC_VERSION string_view demangled_name_view(ti.name()); if (demangled_name_view.starts_with("class ")) diff --git a/test/std-test.cc b/test/std-test.cc index 0f6bf11a..f700a510 100644 --- a/test/std-test.cc +++ b/test/std-test.cc @@ -11,7 +11,9 @@ #include #include "fmt/ranges.h" -#include "gtest/gtest.h" +#include "gtest-extra.h" // StartsWith + +using testing::StartsWith; TEST(std_test, path) { #ifdef __cpp_lib_filesystem @@ -116,4 +118,19 @@ TEST(std_test, exception) { fmt::format("{:t}", ex)); EXPECT_EQ("My Exception", fmt::format("{:}", ex)); } + + try { + throw std::system_error(std::error_code(), "message"); + } catch (const std::system_error& ex) { + EXPECT_THAT(fmt::format("{:t}", ex), StartsWith("std::system_error: ")); + } + +#ifdef __cpp_lib_filesystem + try { + throw std::filesystem::filesystem_error("message", std::error_code()); + } catch (const std::filesystem::filesystem_error& ex) { + EXPECT_THAT(fmt::format("{:t}", ex), + StartsWith("std::filesystem::filesystem_error: ")); + } +#endif }