diff --git a/llvm/unittests/ADT/DenseMapTest.cpp b/llvm/unittests/ADT/DenseMapTest.cpp --- a/llvm/unittests/ADT/DenseMapTest.cpp +++ b/llvm/unittests/ADT/DenseMapTest.cpp @@ -9,6 +9,7 @@ #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/DenseMapInfo.h" #include "llvm/ADT/DenseMapInfoVariant.h" +#include "llvm/ADT/StringRef.h" #include "gmock/gmock.h" #include "gtest/gtest.h" #include @@ -756,4 +757,12 @@ // operator==. EXPECT_FALSE(DenseMapInfo::isEqual(Keys[2], Keys[2])); } + +// Test that gTest prints map entries as pairs instead of opaque objects. +// See third-party/unittest/googletest/internal/custom/gtest-printers.h +TEST(DenseMapCustomTest, PairPrinting) { + DenseMap Map = {{1, "one"}, {2, "two"}}; + EXPECT_EQ(R"({ (1, "one"), (2, "two") })", ::testing::PrintToString(Map)); +} + } // namespace diff --git a/third-party/unittest/googletest/include/gtest/internal/custom/gtest-printers.h b/third-party/unittest/googletest/include/gtest/internal/custom/gtest-printers.h --- a/third-party/unittest/googletest/include/gtest/internal/custom/gtest-printers.h +++ b/third-party/unittest/googletest/include/gtest/internal/custom/gtest-printers.h @@ -40,6 +40,7 @@ #define GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_ #if !GTEST_NO_LLVM_SUPPORT +#include "llvm/ADT/DenseMap.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringRef.h" #include @@ -63,6 +64,17 @@ inline void PrintTo(const SmallVectorImpl &S, std::ostream *OS) { *OS << ::testing::PrintToString(std::string(S.data(), S.size())); } + +// DenseMap's entries inherit from std::pair, and should act like pairs. +// However gTest's provided `PrintTo(pair)` template won't deduce K and V +// because of the needed derived-to-base conversion. +namespace detail { +template +inline void PrintTo(const DenseMapPair &Pair, std::ostream *OS) { + *OS << ::testing::PrintToString(static_cast &>(Pair)); +} +} // namespace detail + } // namespace llvm #endif // !GTEST_NO_LLVM_SUPPORT