diff options
author | James Dennett <jdennett@google.com> | 2018-05-10 22:39:19 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-05-10 22:39:19 -0700 |
commit | 54e331b88bca8e9ab9de55153a3e6d295299aad0 (patch) | |
tree | 1f32a2801838eda271546d0380b41f3878803049 | |
parent | fc66ae45fc7f935eef23af27347761ba4050ad6e (diff) | |
download | googletest-54e331b88bca8e9ab9de55153a3e6d295299aad0.tar.gz googletest-54e331b88bca8e9ab9de55153a3e6d295299aad0.tar.bz2 googletest-54e331b88bca8e9ab9de55153a3e6d295299aad0.zip |
Add support for versioned standard libraries.
This canonicalizes demangled names by omitting a nested inline namespace within namespace std if the name of the nested namespace begins with a double underscore. This improves compatibility with libc++.
-rw-r--r-- | googletest/include/gtest/internal/gtest-type-util.h.pump | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/googletest/include/gtest/internal/gtest-type-util.h.pump b/googletest/include/gtest/internal/gtest-type-util.h.pump index 251fdf02..61228623 100644 --- a/googletest/include/gtest/internal/gtest-type-util.h.pump +++ b/googletest/include/gtest/internal/gtest-type-util.h.pump @@ -54,6 +54,22 @@ $var n = 50 $$ Maximum length of type lists we want to support. namespace testing { namespace internal { + +// Canonicalizes a given name with respect to the Standard C++ Library. +// This handles removing the inline namespace within `std` that is +// used by various standard libraries (e.g., `std::__1`). Names outside +// of namespace std are returned unmodified. +inline std::string CanonicalizeForStdLibVersioning(std::string s) { + static constexpr char prefix[] = "std::__"; + if (s.compare(0, strlen(prefix), prefix) == 0) { + auto end = s.find("::", strlen(prefix)); + if (end != s.npos) { + // Erase the `::__` plus whatever was between that and the next `::`. + s.erase(strlen("std"), strlen("::__") + end - strlen(prefix)); + } + } + return s; +} // GetTypeName<T>() returns a human-readable name of type T. // NB: This function is also used in Google Mock, so don't move it inside of @@ -71,9 +87,9 @@ std::string GetTypeName() { using abi::__cxa_demangle; # endif // GTEST_HAS_CXXABI_H_ char* const readable_name = __cxa_demangle(name, 0, 0, &status); - const std::string name_str(status == 0 ? readable_name : name); + std::string name_str(status == 0 ? readable_name : name); free(readable_name); - return name_str; + return CanonicalizeForStdLibVersioning(std::move(name_str)); # else return name; # endif // GTEST_HAS_CXXABI_H_ || __HP_aCC |