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++.
This commit is contained in:
		@@ -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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user