diff options
author | Sam McCall <sam.mccall@gmail.com> | 2023-05-26 14:59:54 +0200 |
---|---|---|
committer | Sam McCall <sam.mccall@gmail.com> | 2023-06-06 18:36:37 +0200 |
commit | 9e932e08a8300f3366ace04ba8fda4946db406b9 (patch) | |
tree | 86650e027be3200e1c27a2b3c39fef3fbf044467 /llvm/unittests/ADT/DenseMapTest.cpp | |
parent | f705a60eb735376561f2c20863e5299398c75b17 (diff) | |
download | llvm-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.cpp | 20 |
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 |