diff --git a/llvm/include/llvm/ADT/DenseMapInfo.h b/llvm/include/llvm/ADT/DenseMapInfo.h --- a/llvm/include/llvm/ADT/DenseMapInfo.h +++ b/llvm/include/llvm/ADT/DenseMapInfo.h @@ -318,8 +318,19 @@ } static bool isEqual(const Variant &LHS, const Variant &RHS) { - return LHS == RHS; - } + return LHS.index() == RHS.index() && std::visit(EqVisitor{}, LHS, RHS); + } + + private: + struct EqVisitor { + template + bool operator()(const T &LHS, const U &RHS) const { + return false; + } + template bool operator()(const T &LHS, const T &RHS) const { + return DenseMapInfo::isEqual(LHS, RHS); + } + }; }; } // end namespace llvm 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 @@ -736,5 +736,7 @@ EXPECT_THAT(Map, testing::SizeIs(2)); EXPECT_NE(DenseMapInfo::getHashValue(Keys[0]), DenseMapInfo::getHashValue(Keys[1])); + EXPECT_TRUE(DenseMapInfo::isEqual(Keys[0], Keys[0])); + EXPECT_FALSE(DenseMapInfo::isEqual(Keys[0], Keys[1])); } } // namespace