aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/ADT/DenseMapTest.cpp
diff options
context:
space:
mode:
authorSam McCall <sam.mccall@gmail.com>2023-05-26 14:59:54 +0200
committerSam McCall <sam.mccall@gmail.com>2023-06-06 18:36:37 +0200
commit9e932e08a8300f3366ace04ba8fda4946db406b9 (patch)
tree86650e027be3200e1c27a2b3c39fef3fbf044467 /llvm/unittests/ADT/DenseMapTest.cpp
parentf705a60eb735376561f2c20863e5299398c75b17 (diff)
downloadllvm-9e932e08a8300f3366ace04ba8fda4946db406b9.zip
llvm-9e932e08a8300f3366ace04ba8fda4946db406b9.tar.gz
llvm-9e932e08a8300f3366ace04ba8fda4946db406b9.tar.bz2
[ADT] Fix DenseMapInfo<variant>::isEqual to delegate to DenseMapInfo, not ==
Differential Revision: https://reviews.llvm.org/D151557
Diffstat (limited to 'llvm/unittests/ADT/DenseMapTest.cpp')
-rw-r--r--llvm/unittests/ADT/DenseMapTest.cpp20
1 files changed, 19 insertions, 1 deletions
diff --git a/llvm/unittests/ADT/DenseMapTest.cpp b/llvm/unittests/ADT/DenseMapTest.cpp
index 79d57d3..ba5cd4c 100644
--- a/llvm/unittests/ADT/DenseMapTest.cpp
+++ b/llvm/unittests/ADT/DenseMapTest.cpp
@@ -690,6 +690,10 @@ struct A {
struct B : public A {
using A::A;
};
+
+struct AlwaysEqType {
+ bool operator==(const AlwaysEqType &RHS) const { return true; }
+};
} // namespace
namespace llvm {
@@ -702,6 +706,16 @@ struct DenseMapInfo<T, std::enable_if_t<std::is_base_of_v<A, T>>> {
return LHS.value == RHS.value;
}
};
+
+template <> struct DenseMapInfo<AlwaysEqType> {
+ using T = AlwaysEqType;
+ static inline T getEmptyKey() { return {}; }
+ static inline T getTombstoneKey() { return {}; }
+ static unsigned getHashValue(const T &Val) { return 0; }
+ static bool isEqual(const T &LHS, const T &RHS) {
+ return false;
+ }
+};
} // namespace llvm
namespace {
@@ -725,16 +739,20 @@ TEST(DenseMapCustomTest, SFINAEMapInfo) {
}
TEST(DenseMapCustomTest, VariantSupport) {
- using variant = std::variant<int, int>;
+ using variant = std::variant<int, int, AlwaysEqType>;
DenseMap<variant, int> Map;
variant Keys[] = {
variant(std::in_place_index<0>, 1),
variant(std::in_place_index<1>, 1),
+ variant(std::in_place_index<2>),
};
Map.try_emplace(Keys[0], 0);
Map.try_emplace(Keys[1], 1);
EXPECT_THAT(Map, testing::SizeIs(2));
EXPECT_NE(DenseMapInfo<variant>::getHashValue(Keys[0]),
DenseMapInfo<variant>::getHashValue(Keys[1]));
+ // Check that isEqual dispatches to isEqual of underlying type, and not to
+ // operator==.
+ EXPECT_FALSE(DenseMapInfo<variant>::isEqual(Keys[2], Keys[2]));
}
} // namespace